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 阅读(165) 评论(0) 编辑 收藏 举报