POJ 1125 Stockbroker Grapevine
题意:给你n个股票经纪人,要你再找出联系全部人的最短时间。有则输出。无则输出一个字符串。
接下来是n组数据,每组数据开头表示第i个经纪人有m个联系人。接下来是m对数据 第一个表示 第几个联系人 第二个数则是联系到他所须要的时间
思路:这个题目基本的是理解题目的意思,理解之后就很easy了,仅仅要先求出每2个点的最短距离。然后再求出以第i个点为顶点到达第j个点所须要的最长距离,就可以把全部的人联系一遍。由于我们求出每2个点的最短距离。所以能够用floyd算法了,这个算法是最easy理解的!
所以AC代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define inf 100
int d[120][120];
int main()
{
int i,j,n,k;
while(scanf("%d",&n)!=EOF)
{
if(n==0)break;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
d[i][j]=inf;
}
for(i=1;i<=n;i++)
{
int u;
scanf("%d",&u);
for(j=1;j<=u;j++)
{
int v,w;
scanf("%d %d",&v,&w);
d[i][v]=w;
}
}
for(i=1;i<=n;i++) //求出每2个点的最短距离
for(j=1;j<=n;j++)
for(k=1;k<=n;k++)
{
if(j!=k&&d[j][k]>d[j][i]+d[i][k])
d[j][k]=d[j][i]+d[i][k];
}
int temp,maxx,minn=inf;
for(i=1;i<=n;i++)//每次以i为图的顶点
{
maxx=0;
for(j=1;j<=n;j++) //找出以i为顶点的最大距离点
if(i!=j&&maxx<d[i][j])
maxx=d[i][j];
if(maxx<minn) //替换
{
minn=maxx;
temp=i;
}
}
if(minn<inf)
printf("%d %d\n",temp,minn);
else
printf("disjoint\n");
}
return 0;
}
posted on 2017-04-12 12:04 cynchanpin 阅读(169) 评论(0) 收藏 举报
浙公网安备 33010602011771号