码迷,mamicode.com
首页 > 其他好文 > 详细

poj 1125 Stockbroker Grapevine(多源最短路)

时间:2014-07-24 17:38:36      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:最短路   poj   floyd   

链接:poj 1125

题意:输入n个经纪人,以及他们之间传播谣言所需的时间,

问从哪个人开始传播使得所有人知道所需时间最少,这个最少时间是多少

分析:因为谣言传播是同时的,对于某条路径使得所有人都知道的时间,不是时间的总和,而是路径中最长的边

从多条路径的最长边,找出最小值,因为为多源最短路,用Floyd比较方便

#include<stdio.h>
#include<limits.h>
int a[105][105];
void floyd(int n)
{
    int i,j,k,s,pos;
    for(k=1;k<=n;k++)
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                if(a[i][k]!=INT_MAX&&a[k][j]!=INT_MAX&&a[i][k]+a[k][j]<a[i][j])
                    a[i][j]=a[i][k]+a[k][j];
    k=INT_MAX;
    pos=0;
    for(i=1;i<=n;i++){
        s=0;
        for(j=1;j<=n;j++)             //先求出路径中的最长边为总传播时间
            if(i!=j&&a[i][j]>s)
                s=a[i][j];
        if(s<k){            //再找出传播时间的最小值
            k=s;
            pos=i;
        }
    }
    if(k==INT_MAX)
        printf("disjoint\n");
    else
        printf("%d %d\n",pos,k);

}
int main()
{
    int n,m,i,j,b,t;
    while(scanf("%d",&n)!=EOF){
        if(n==0)
            break;
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                a[i][j]=INT_MAX;
        for(i=1;i<=n;i++){
            scanf("%d",&m);
            for(j=1;j<=m;j++){
                scanf("%d%d",&b,&t);
                a[i][b]=t;              //单向的
            }
        }
        floyd(n);
    }
    return 0;
}


poj 1125 Stockbroker Grapevine(多源最短路),布布扣,bubuko.com

poj 1125 Stockbroker Grapevine(多源最短路)

标签:最短路   poj   floyd   

原文地址:http://blog.csdn.net/acm_code/article/details/38085573

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!