• POJ1125 ZOJ1082


    题意:有N个股票经济人可以互相传递消息,他们之间存在一些单向的通信路径。现在有一个消息要由某个人开始传递给其他所有人,问应该由哪一个人来传递,才能在最短时间内  

            让所有人都接收到消息。若不存在这样一个人,则输出disjoint

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <algorithm>
     6 using namespace std;
     7 #define inf 9999999
     8 #define N 105
     9 int n,map[N][N];
    10 
    11 void Floyd()//Floyd算每两个点之间的距离 
    12 {
    13     for(int k=1; k<=n; k++)
    14     {
    15         for(int i=1; i<=n; i++)
    16         {
    17             if(k==i||map[i][k]==inf) continue;
    18             for(int j=1; j<=n; j++)
    19             {
    20                 if(j==k||map[k][j]==inf) continue;
    21                 map[i][j] = min(map[i][j],map[i][k]+map[k][j]);
    22             }
    23         }
    24     }
    25 }
    26 
    27 int main()
    28 {
    29     while(scanf("%d",&n)&&n)
    30     {
    31         for(int i=1; i<=n; i++)
    32         for(int j=1; j<=n; j++)
    33         {
    34             if(i==j) map[i][j] = 0;
    35             else map[i][j] = inf;
    36         }
    37         int m,a,t;
    38         for(int i=1; i<=n; i++)
    39         {
    40             scanf("%d",&m);
    41             for(int j=1; j<=m; j++)
    42             {
    43                 scanf("%d%d",&a,&t);
    44                 map[i][a] = t;
    45             }
    46         }
    47         Floyd();
    48         int ans=inf,temp;
    49         int num,flag,flag1=0;//flag1 记录是否存在某个点可以到其他任何点 
    50         for(int i=1; i<=n; i++) 
    51         {
    52             flag = 1; temp = 0;
    53             for(int j=1; j<=n; j++)
    54             {
    55                 if(i==j) continue; 
    56                 if(map[i][j]==inf) //如果从i到j没路。。说明不可以从i这个点出发 
    57                 {
    58                     flag = 0;
    59                     continue;
    60                 }
    61                 temp = max(temp,map[i][j]);//记录从i开始到所有点之间最长的路 
    62             }
    63             if(flag&&ans>temp) //如果i到所有点都有路并且最长的路比之前小 
    64             {
    65                 num = i;
    66                 ans = temp;
    67                 flag1 = 1;
    68             }
    69         }
    70         if(flag1)
    71         printf("%d %d
    ",num,ans);
    72         else printf("disjoint
    ");
    73     }
    74     return 0;
    75 } 
    View Code

      

  • 相关阅读:
    十七、mysql数据库备份
    消费端ACK和重回队列
    RabbitMQ TTL、死信队列
    消费端限流策略
    029异常处理
    028class_part2
    027class_part1
    026json和pickle,xml模块
    025__name__变量和目录结构规范
    024模块的概念
  • 原文地址:https://www.cnblogs.com/ar940507/p/3247907.html
Copyright © 2020-2023  润新知