Floyd算法的一个应用吧
/*
设R是非空集合上的关系,R的传递闭包是A上的关系R',使得R'满足以下条件:
1)、R'是传递的
2)、R是R'的子集
3)、对A上的任何包含R的传递关系R'',有 R'是R''的子集
下面是用Folyd-Warshall算法来解
*/
#include <iostream>
using namespace std;
int main()
{
int vexnum,arcnum;
int graph[20][20];
int i,j,k,a,b;
cout<<"输入有向图的顶点数和边数:";
cin>>vexnum>>arcnum;
for(i=0;i<=vexnum;i++)
for(j=0;j<=vexnum;j++)
{
if(i == j)
graph[i][j]=1;
else
graph[i][j]=0;
}
for(i=1;i<=arcnum;i++)
{
cout<<"输入第 "<<i<<" 条边的起点,终点: ";
cin>>a>>b;
graph[a][b]=1;
}
//求传递闭包
for(k=1;k<=vexnum;k++)
for(i=1;i<=vexnum;i++)
for(j=1;j<=vexnum;j++)
{
graph[i][j] += graph[i][k]*graph[k][j];
}
for(i=1;i<=vexnum;i++)
{
for(j=1;j<=vexnum;j++)
{
if(graph[i][j])
cout<<1<<" ";
else
cout<<0<<" ";
}
cout<<endl;
}
return 0;
}