poj 1125 Stockbroker Grapevine(多源最短路)

来源:互联网 发布:校园网络设计方案ppt 编辑:程序博客网 时间:2024/05/16 19:32

链接: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;}


3 0
原创粉丝点击