//沃舍尔算法计算传递闭包
//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 5
0 0
0 2
1 1
2 0
2 1
1 0 1
0 1 0
1 1 0
111
010
111Press 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 5
0 0
0 2
1 1
2 0
2 1
1 0 1
0 1 0
1 1 0
111
010
111Press any key to continue
//沃舍尔算法计算传递闭包//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 using namespace std;int v,edge;int*