【离散数学实验】关系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
- 【离散数学实验】关系R的幂运算及其传递闭包的计算
- 离散数学 关系性质的判断及其闭包运算
- 离散数学实验之求解关系的闭包运算
- 【离散数学实验】关系R的性质判断
- 离散数学实践:关系的性质判断&关系的幂&关系的传递闭包
- 【离散数学实验】相容关系的极大相容类的计算
- 离散数学中关系的自反、对称、传递闭包C++代码
- 一种离散数学中求传递闭包的算法实现
- 关系R的运算
- 离散数学 集合的运算
- 离散数学实验 命题变元的运算,真值表....
- 离散数学实验源代码----集合运算和关系运算
- 离散数学-二元关系、闭包的概念
- 求关系的传递闭包
- 【离散数学】1.3集合的运算
- 离散数学与计算机的关系
- 【离散数学】实验三 偏序关系中盖住关系的求取及格论中有补格的判定
- 南京邮电大学离散数学实验三偏序关系中盖住关系的求取及格论中有补格的判定
- 搭建nginx+ffmpeg服务
- 关于如何在python中打印出堆栈的log
- 甜美,大方,帅气,活力,不,这只是你的外表
- CSS基本样式
- Oracle 自增ID
- 【离散数学实验】关系R的幂运算及其传递闭包的计算
- 闯祸了
- 如何做个好员工(转载)
- postgresql常用命令
- 过滤和排序
- android手机客户端连接服务器实现交互
- 自定义控件--自定义对话框
- ArcGIS教程:影响路径距离(水平系数)(一)
- mount ntfs read-only.