【离散数学实验】关系R的幂运算及其传递闭包的计算
2015-11-10 14:23
537 查看
#include<iostream>
using namespace std;
#define Max 10//定义最大值10
typedef struct
{
char base1;
char base2;
int num1;
int num2;
}Relation;//关系R
//=============================================================================
int InputA(int &M, int &d)//输入集合A
{
cout << "请输入集合元素类型 1)---字符型 2)---整型" << endl;
cin >> d;
switch (d)
{
case 1:
{
char a[Max];
cout << "请输入集合元素:如{a,b,c}" << endl;
for (int i = 0; i < Max; i++)
{
a[M]=getchar();
if (getchar() == '\n'||M>=Max)
break;
M++;
}
return 0;
}
case 2:
{
int a[Max];
cout << "请输入集合元素:如{1,2,3}" << endl;
for (int i = 0; i < Max; i++)
{
a[M] = getchar();
if (getchar() == '\n' || M >= Max)break;
M++;
}
return 0;
}
}
return 0;
}//InputA
//=============================================================================
int CreatMat(Relation R[Max], int a[Max][Max], int M, int d)//创建关系矩阵
{
if (d==1)
{
cout << "请输入关系R(输入#结束输入):如<a,b>" << endl;
for (int i = 0; i < M*M; i++)
{
cin >> R[i].base1 >> R[i].base2;
R[i].num1=int (R[i].base1)-96;//强制类型转换将字符a,b,c...转换成1,2,3...
R[i].num2=int (R[i].base2)-96;
if (R[i].base1 == '#' || R[i].base2 == '#')
break;
}
for (int m = 0; m < M; m++)
for (int n = 0; n < M; n++)
a[R[m].num1 - 1][R[m].num2 - 1] = 1;
}
if (d==2)
{
cout << "请输入关系R(输入-1结束输入):如<1,1>" << endl;
for (int i = 0; i < M*M; i++)
{
cin >> R[i].num1 >> R[i].num2;
if (R[i].num1 == -1 || R[i].num2 == -1)
break;
}
for (int m = 0; m < M; m++)
for (int n = 0; n < M; n++)
a[R[m].num1 - 1][R[m].num2 - 1] = 1;
}
return a[M][M];
}//CreatMat
//=============================================================================
int MultiplyMat(int a[Max][Max], int n, int M, int mat[Max][Max])//计算R的n次幂
{
int temp[Max][Max];
int i, j, k;
cout<<"关系R的0次方为:"<<endl;//0次幂
for(i=0;i<M;i++)
{
for(j=0;j<M;j++)
{
if(i==j)
mat[i][j]=1;
else
mat[i][j]=0;
cout<<mat[i][j]<<" ";
}
cout<<endl;
}
cout<<"关系R的1次方为:"<<endl;
for ( i = 0; i < M; i++)
{
for (j = 0; j < M; j++)
{
mat[i][j] = a[i][j];
cout<<mat[i][j]<<" ";
}
cout<<endl;
}
for (int count = 2; count <=n; count++)//n>=2次幂
{
cout<<"关系R的"<<count<<"次方为:"<<endl;
for (i = 0; i < M; i++)
for (j = 0; j < M; j++)
temp[i][j] = mat[i][j];
for ( i = 0; i < M; i++)
{
for ( j = 0; j< M; j++)
{
int sum = 0;
for ( k = 0; k < M; k++)
{
sum += temp[i][k] * a[k][j];
if(sum!=0)
sum=1;
mat[i][j] = sum;
}cout<<mat[i][j]<<" ";
}
cout<<endl;
}
}
return mat[M][M];
}//MultiplyMat
//=============================================================================
int Warshall(int a[Max][Max],int M)//Warshall算法求传递闭包
{
for (int i = 0; i < M; i++)
for (int j = 0; j < M; j++)
{
if (a[j][i] == 1)
for (int k = 0; k < M; k++)
{
a[j][k] = a[j][k] + a[i][k];
if (a[j][k] != 0)
a[j][k] = 1;
}
}
return a[M][M];
}//Warshall
//=============================================================================
int Transfer(int a[Max][Max],int M)//判断传递性
{
int h = 1;
for (int i = 0; i<M; i++)
{
if (h == 0) break;
for (int j = 0; j<M; j++)
if (a[i][j] == 0)
for (int k = 0; k<M; k++)
if (a[i][k] * a[k][j] == 1)
{
h = 0;
break;
}
}
return h;
}//Transfer
//=============================================================================
void PrintMat(int a[Max][Max], int M)
{
for (int i = 0; i < M; i++)
{
for (int j = 0; j < M; j++)
cout << a[i][j] << " ";
cout << endl;
}
}//PrintMat
//=============================================================================
int main()
{
int M = 0, d;
InputA(M, d);
Relation R[Max];
int a[Max][Max] = {0};//定义关系矩阵
CreatMat(R, a, M, d);
cout << "该关系的关系矩阵为:" << endl;
PrintMat(a, M);
cout << "请输入要计算的R的幂的次数n:";
int n;
cin >> n;
int mat[Max][Max];
MultiplyMat(a, n, M,mat);//计算并输出R的n次幂
Warshall(a,M);
if (Transfer(a, M))//若计算得到的闭包不再具有传递性,输出该传递闭包
{
cout << "关系R的传递闭包为:" << endl;
PrintMat(a, M);
}
else
cout << "An error occurred!" << endl;
return 0;
}//main
//=============================================================================
相关文章推荐
- 使用Java 将html转换PDF
- SpringMVC 集成 Swagger【问题】 No qualifying bean of type RequestMappingHandlerMapping found for dependency
- 关于多核游览器指定渲染内核的方法。
- Cache 工具类
- 甜美,大方,帅气,活力,不,这只是你的外表
- 搭建nginx+ffmpeg服务
- php实现可运算的验证码
- oracle数据库软件静默安装
- oracle数据库软件静默安装
- oracle数据库软件静默安装
- select函数详解
- unity残影效果的实现
- CSS基本样式
- 开源项目PullToRefresh详解(一)——PullToRefreshListView
- C语言拼接字符串和整型
- pxe无人值守自动安装
- (转)ZwQuerySystemInformation枚举内核模块及简单应用
- Fragment无法接收从service发过来的广播
- 中科院与汤森路透联合发布《2015研究前沿》
- 高期模糊算法-汇编实现