您的位置:首页 > 其它

POJ -- 1125 Stockbroker Grapevine(Floyd)

2015-02-28 18:13 267 查看
题目大意:Stockbrokers要散布一个股票的谣言,谣言只能在相互认识的人中传递,给出人与人的关系(是否认识),以及传言在某两个认识的人中传递所需的时间。求出以哪个人作为散布谣言的起点,能使得所有人都受到谣言的时间最短,并求出最后一个人得到消息的时间,如果给定的网络不完全,则输出“disjoint”。

思路分析:没有固定的源点终点,用floyd可以求任意两个点的最短路径;而求最后一个人得到消息的时间也就是最短路径的最后一个人,也就是最短路径中到源点时间最长的点。

代码实现:

#include<stdio.h>
#define min(a,b) (a<b?a:b)
int w[110][110],n;
void Floyd(){
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
w[i][j]=min(w[i][k]+w[k][j],w[i][j]);
}
}
}
int main(){
while(~scanf("%d",&n),n){
int m,s,t;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
w[i][j]=1e9;
w[i][i]=0;
}
for(int i=1;i<=n;i++){
scanf("%d",&m);
while(m--){
scanf("%d%d",&s,&t);
if(t<w[i][s]) w[i][s]=t;
}
}
Floyd();
int sum_t,sp,last_t,elt,min_t=1e9,flag;
for(int i=1;i<=n;i++){
sum_t=0,elt=-1,flag=0;
for(int j=1;j<=n;j++){
if(w[i][j]==1e9){
flag=1;
break;
}
sum_t+=w[i][j];
if(w[i][j]>elt) elt=w[i][j];
}
if(!flag&&sum_t<min_t){
min_t=sum_t;
sp=i;
last_t=elt;
}
}
if(min_t==1e9) printf("disjoint\n");
else printf("%d %d\n",sp,last_t);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: