poj 2139 Six Degrees of Cowvin Bacon (Floyd 算法)

题:http://poj.org/problem?id=2139

任意两点之间的最短路径问题:

#include<iostream>
#include<cstdlib>
using namespace std;
const int MAXN=301;
const int INF=99999;
int d[MAXN][MAXN],dis[MAXN],N,M;
void solve()
{
	int ans=INF;
	for(int k=1;k<=N;k++){
		for(int i=1;i<=N;i++){
			for(int j=1;j<=N;j++){
				d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
				//cout<<d[i][j]<<endl;
			}
		}
	}
	for(int i=1;i<=N;i++){
		for(int j=1;j<=N;j++){
			d[i][0] += d[i][j];
		}
		//cout<<d[i][0]<<endl;
		d[i][0]=100*d[i][0]/(N-1); 
		ans=min(ans,d[i][0]);
		//cout<<ans<<endl;
	}
	cout<<ans<<endl;
} 
int main()
{
	while(cin>>N>>M)
	{
		for(int i=1;i<=N;i++)
			for(int j=1;j<=N;j++){
				d[i][j]=INF;
				if(i==j) d[i][j]=0;
			}
		for(int i=1;i<=M;i++){
			int num;
			cin>>num;
			for(int i=1;i<=num;i++) cin>>dis[i];
			
			for(int i=1;i<=num;i++){
				for(int j=i+1;j<=num;j++){
					d[dis[i]][dis[j]]=1;
					d[dis[j]][dis[i]]=1;
				}
			}
		}	
		solve();
	}
	return 0;
}


你可能感兴趣的:(最短路)