计算传递闭包
来源:互联网 发布:匡恩网络 工控安全 编辑:程序博客网 时间:2024/04/19 09:42
//沃舍尔算法计算传递闭包//warshall://W=M//for k=1 to n//begin// for i=1 to n// begin// for j=1 to n// W(ij)=W(ij)+(W(ik)*W(kj))// end//end////#include <iostream>using namespace std;int v,edge;int** draw();//绘图void transitive(int **a);//计算int main(int argc, char const *argv[]){int** a=draw();transitive(a);delete []a;return 0;}int** draw()//绘图 { int i,j; cin>>v>>edge;///输入点数目和边数目 int **a=new int*[v]; for ( i = 0; i < v; ++i) a[i]=new int[v]; for ( i = 0; i < v; ++i) for ( j = 0; j < v; ++j) a[i][j]=0; int spot1,spot2; for ( i = 0; i < edge; ++i) { cin>>spot1>>spot2; a[spot1][spot2]=1; } ///-------------------------------------------------------------/// cout<<"\n"; for ( i = 0; i < v; ++i) { for ( j = 0; j < v; ++j) { cout<<a[i][j]<<" "; } cout<<"\n"; } cout<<"\n"; return a; } void transitive(int **a)//计算{int i,j,k; for ( k = 0; k < v; ++k) { for (i = 0; i < v; ++i) { for ( j = 0; j < v; ++j) { if (a[i][j] || (a[i][k] && a[k][j])) { a[i][j]=1; } } } } for ( i = 0; i < v; ++i) { cout<<"\n"; for ( j = 0; j < v; ++j) { cout<<a[i][j]; } }}3 50 00 21 12 02 11 0 10 1 01 1 0111010111Press any key to continue
//计算传递闭包//R*=R1+R2+R3+....+Rn//Rn=Rn-1+R1//使用矩阵表示//算法://A=M//B=A//for(2 to n)// begin// A=A*M// B=B+A// end#include <iostream>using namespace std;int v,edge;int** draw();//绘图void transitive(int **a);//计算int main(int argc, char const *argv[]){int** a=draw();transitive(a);delete []a;return 0;}int** draw()//绘图 { int i,j; cin>>v>>edge;///输入点数目和边数目 int **a=new int*[v]; for ( i = 0; i < v; ++i) a[i]=new int[v]; for ( i = 0; i < v; ++i) for ( j = 0; j < v; ++j) a[i][j]=0; int spot1,spot2; for ( i = 0; i < edge; ++i) { cin>>spot1>>spot2; a[spot1][spot2]=1; } ///-------------------------------------------------------------/// cout<<"\n"; for ( i = 0; i < v; ++i) { for ( j = 0; j < v; ++j) { cout<<a[i][j]<<" "; } cout<<"\n"; } cout<<"\n"; return a; } void transitive(int **a)//计算{int i,j,k,h; int **at=new int*[v]; for ( i = 0; i < v; ++i) at[i]=new int[v]; int **bb=new int*[v]; for ( i = 0; i < v; ++i) bb[i]=new int[v]; for ( i = 0; i < v; ++i) for ( j = 0; j < v; ++j) bb[i][j]=at[i][j]=a[i][j]; for ( i = 0; i < v-1; ++i) { for ( j = 0; j < v; ++j) for ( k = 0; k < v; ++k) for ( h = 0; h < v; ++h) if (at[j][h]*a[h][k] == 1)at[j][k]=1;////////if (at[j][h] && a[h][k])at[j][k]=1; for ( k = 0; k < v; ++k) for ( h = 0; h < v; ++h)if (bb[k][h]+at[k][h] >=1)//if (bb[k][h] || at[k][h]) bb[k][h]=1; } for ( k = 0; k <v; ++k){ cout<<"\n"; for ( h = 0; h < v; ++h) cout<<bb[k][h]; }}3 50 00 21 12 02 11 0 10 1 01 1 0111010111Press any key to continue
0 0