poj1125 Stockbroker

   这是一个多源最短路径问题,可以先用floyd求出各顶点之间的最短距离,然后再分别以某一点为源点,求出其余各点到该点的最长距离,最后再取最少值。

#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=105;
const int INF=100000000;
int d[maxn][maxn];
int n,ans,start;

inline int min(int a,int b)
{
	return a<b?a:b;
}

int main()
{
	int num,a,b;
	int i,j,k;
	int temp;
	bool ok;
	while(scanf("%d",&n),n)
	{
		for(i=1;i<=n;i++)
			for(j=1;j<=n;j++)
			{
				d[i][j]=INF;
				if(i==j)
					d[i][j]=0;
			}
		for(i=1;i<=n;i++)
		{
			scanf("%d",&num);
			while(num--)
			{
				scanf("%d%d",&a,&b);
				d[i][a]=b;
			}
		}
		for(k=1;k<=n;k++)
			for(i=1;i<=n;i++)
				for(j=1;j<=n;j++)
					d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
		ans=INF;
		ok=false;
		for(i=1;i<=n;i++)
		{
			temp=-1;
			for(j=1;j<=n;j++)
			{
				if(d[i][j]==INF)
					break;
				if(d[i][j]>temp)
					temp=d[i][j];
			}
			if(j<=n)
				continue;
			ok=true;
			if(temp<ans)
			{
				ans=temp;
				start=i;
			}
		}
		if(ok)
			printf("%d %d\n",start,ans);
		else
			printf("disjoint\n");
	}
	return 0;
}


 

你可能感兴趣的:(poj1125 Stockbroker)