zoukankan      html  css  js  c++  java
  • poj1125

    题目大意:哎,意思看了半天,看了别人的解释才明白,就是说从一个经纪人出发传递消息,直到所有人都收到消息

    也就是说只要找到该经纪人到其它所有点的最短距离中的最大一个时间,就说明最后一个也收到消息了。

    而我们所要做的就是找到从每个经纪人为出发点的这样一个时间,再取其中最小的就是题目所要的时间了

    代码如下

     1 #include <iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 using namespace std;
     5 const int maxs = 105;
     6 const int INF = 0x3f3f3f3f;
     7 int N,M;
     8 int edge[maxs][maxs];
     9 void dijkstra()
    10 {
    11     int totalTime[N+1];
    12     memset(totalTime,0,sizeof(totalTime));
    13     for(int v=1;v<=N;v++)
    14     {
    15         int dist[maxs];//用来保存其它各点到选定点的最短距离
    16         bool vis[maxs];//判断该点是否已经加入到集合中了
    17         memset(vis,false,sizeof(vis));
    18         vis[v]=true;
    19         for(int i=1;i<=N;i++)
    20             dist[i]=edge[v][i];
    21         for(int i=1;i<=N;i++)
    22         {
    23             int mins=INF,k;
    24             for(int j=1;j<=N;j++)
    25                 if(!vis[j]&&dist[j]<mins)
    26                 {
    27                     mins = dist[j];
    28                     k=j;
    29                 }
    30             vis[k]=true;//该点已经加入集合
    31             //新的点加入,更新选定点到还没有被构造的点的最短距离
    32             for(int j=1;j<=N;j++)
    33                 if(!vis[j]&&edge[k][j]<INF&&(dist[k]+edge[k][j])<dist[j])
    34                     dist[j]=dist[k]+edge[k][j];
    35         }
    36         totalTime[v]=dist[1];
    37         for(int i=2;i<=N;i++)
    38             if(dist[i]>totalTime[v])
    39                 totalTime[v]=dist[i];
    40 
    41     }
    42     int index=1;
    43     for(int i=2;i<N+1;i++)
    44         if(totalTime[i]<totalTime[index])
    45             index=i;
    46     if(totalTime[index]==INF)
    47         printf("disjoint
    ");
    48     else
    49         printf("%d %d
    ",index,totalTime[index]);
    50 }
    51 int main()
    52 {
    53     freopen("in.txt","r",stdin);
    54     while(scanf("%d",&N)!=EOF&&N)
    55     {
    56         for(int i=1;i<=N;i++)
    57             for(int j=1;j<=N;j++)
    58                 edge[i][j]=INF;
    59         for(int i=1;i<=N;i++)
    60         {
    61             scanf("%d",&M);
    62             int x,time;
    63             edge[i][i]=0;
    64             for(int j=1;j<=M;j++)
    65             {
    66                 scanf("%d%d",&x,&time);
    67                 edge[i][x]=time;
    68             }
    69         }
    70         dijkstra();
    71     }
    72     return 0;
    73 }
  • 相关阅读:
    php分页问题
    php中memcached的使用
    Linux安装Git
    day06
    day07
    day03
    day05
    day04
    列表的操作
    初识数据类型
  • 原文地址:https://www.cnblogs.com/wt20/p/5730408.html
Copyright © 2011-2022 走看看