poj1125 Stockbroker Grapevine 最短路 Floyd 思考

来源:互联网 发布:hadoop ssh端口配置 编辑:程序博客网 时间:2024/05/17 06:18

大致题意:

有n个人,第i个人可以给a[i]个人发消息,给每个人发送消息也有相应的时间。一个人给剩下的n-1个人发送消息的总时间定义为给每个人发送消息的时间的最大值。现在问你,应该从哪个人开始发消息使得总时间最少

大致思路

floyd模版题,我们求出n个源点所有的最短路,如果有一个源点到不了剩下的所有点,那么代表此路不通

每次枚举一个源点,求出源点到其他点的最短路的最大值

最后求出最小值,就是答案。

代码:

#include<stdio.h>#include<iostream>using namespace std;#define inf 99999999int dis[105][105];int n;void Floyd(){    for(int k=1;k<=n;k++)    {        for(int i=1;i<=n;i++)        {            for(int j=1;j<=n;j++)            {                if(dis[i][j]>dis[i][k]+dis[k][j])                {                    dis[i][j]=dis[i][k]+dis[k][j];                }            }        }    }    return;}int main(){    while(~scanf("%d",&n)&&n)    {        for(int i=1;i<=n;i++)        {            for(int j=1;j<=n;j++)            {                if(i==j)dis[i][j]=0;                else                dis[i][j]=inf;            }        }        int num,peo,time;        for(int i=1;i<=n;i++)        {            scanf("%d",&num);            for(int j=1;j<=num;j++)            {                scanf("%d%d",&peo,&time);                dis[i][peo]=time;            }        }        Floyd();        int minl=inf;        int flag=0;        int lab;        int ans;        int j;        for(int i=1;i<=n;i++)        {              ans=-1;              for(j=1;j<=n;j++)              {                  if(dis[i][j]==inf)                  {                      flag++;                      break;                  }                  ans=max(ans,dis[i][j]);              }              if(j==n+1&&minl>ans)              {                  minl=ans;                  lab=i;              }        }        if(flag==n)        {            printf("disjoint\n");        }        else        {            printf("%d %d\n",lab,minl);        }    }}


原创粉丝点击