1. 程式人生 > >Floyd演算法求圖的傳遞閉包

Floyd演算法求圖的傳遞閉包

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;
}