您的位置:首页 > 其它

【离散数学实验】关系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

//=============================================================================



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: