【离散数学实验】关系R的幂运算及其传递闭包的计算

来源:互联网 发布:Js用键盘实现图片切换 编辑:程序博客网 时间:2024/04/30 10:46






#include<iostream>using namespace std;#define Max 10//定义最大值10typedef 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//=============================================================================


11 0
原创粉丝点击