38. 股票经济人通信网络

【题目描述】:

有N个股票经济人可以互相传递消息,他们之间存在一些单向的通信路径。现在有一个消息要由某个人开始传递给其他所有人,问应该由哪一个人来传递,才能在最短时间内让所有人都接收到消息。若不存在这样一个人,则输出disjoint。

【输入描述】:

第一行为n,代表总人数,当n=0时结束程序。

接着n行,第i+1行的第一个是一个整数t,表示第i个人可以传递消息给t个人,接着有t对整数,每对的第一个数是j,表示i可以传递消息给j,第二个数是从i直接传递消息到j所用的时间。

【输出描述】:

两个整数,第一个为选点的散布消息的起点,第二个整数时所有人得知消息的最短时间

【样例输入】: 3 2 2 4 3 5 2 1 2 3 6 2 1 2 2 2 5 3 4 4 2 8 5 3 1 5 8 4 1 6 4 10 2 7 5 2 0 2 2 5 1 5 0

【样例输出】: 3 2 3 10

【时间限制、数据范围及描述】:

时间:1s 空间:128M

扫描二维码关注公众号,回复: 6748990 查看本文章

N<=300

代码

#include<algorithm>
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<queue> using namespace std; int n,t,x,y,s,ans,mmin,flag=0; int f[302][302]; int main(){ while(1){ s=0,ans=0,mmin=2147483647,flag=0; scanf("%d",&n); if(n==0){break;} memset(f,0x3f,sizeof(f)); for(int i=1;i<=n;i++){ scanf("%d",&t); for(int j=1;j<=t;j++){ scanf("%d%d",&x,&y); f[i][x]=y; } } for(int k=1;k<=n;k++){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(f[i][j]>f[i][k]+f[k][j]){ f[i][j]=f[i][k]+f[k][j]; } } } } for(int i=1;i<=n;i++){ f[i][i]=0; } for(int i=1;i<=n;i++){ ans=0; for(int j=1;j<=n;j++){ if(ans<f[i][j]){ ans=f[i][j]; } if(f[i][j]==2147483647){ flag=1; } } if(ans<mmin){ mmin=ans; s=i; } } if(flag==0) printf("%d %d\n",s,mmin); else printf("disjoint\n"); } return 0; } 

变量太多,看的头疼。

回归正题,Floyd算法可行,三重循环。

证明: 略 。(易得)

猜你喜欢

转载自www.cnblogs.com/xiongchongwen/p/11137613.html