POJ 1125 Floyd

来源:互联网 发布:爱编程 编辑:程序博客网 时间:2024/05/20 08:24
 题目大意:     直接用 输入示例说明吧,  32 2 4 3 52 1 2 3 62 1 2 2 2    表示 第一行表示一个股票经纪人需要向三个人传消息,第二行表示 第一个人有两个朋友, 向第二个朋友传消息需要 时间4 ,向第三个朋友发消息需要时间 5,第二行表示 第二个人有两个朋友,向第一个人传消息需要时间2,向第三个人传消息需要时间 6,第三行同样。     求 能够 向所有人都传到消息并且需要的时间最短的人,以及 这个人向某个人传消息所花的最多的时间。     输出  3 2 。 即表示 让第三个人传消息 所需的时间最短, 他 向其他人传消息最多的一次用了 时间2。    如果没有人可以 向所有人传递消息,输出 disjoint     解题思路: Floyd 算法。 即穷举断点 ,不断更新两点之间的 最小 距离。                   装态转移方程 map[i,j]:=min{map[i,k]+map[k,j],map[i,j]}        。k表示 穷举得断点。#include <stdio.h>  #define INF 100000 //无穷大    int num, a[101][101];    void Floyd() //Floyd算法求最短路径  {      int i, j, k;        //特别注意:循环的k,i,j的顺序不能改变。我测试过把顺序改为i,j,k就错了。      for (k=1; k<=num; k++)          for (i=1; i<=num; i++)              for (j=1; j<=num; j++)                  if (a[i][k]+a[k][j] < a[i][j])                      a[i][j] = a[i][k] + a[k][j];      return;  }    int main()  {      int i, j;      int m, contact, time, minTime, sum, max,person;        while (scanf("%d", &num) && num)      {          for (i=1; i<=num; i++)              for (j=1; j<=num; j++)              {                  if (i != j) a[i][j] = INF;                  else        a[i][j] = 0;              }          for (i=1; i<=num; i++)          {              scanf("%d", &m);              for (j=1; j<=m; j++)              {                  scanf("%d %d", &contact, &time);                  a[i][contact] = time;              }          }            Floyd(); //调用Floyd函数          minTime = INF;          for (i=1; i<=num; i++)          {              sum = 0;            int tmax=0;              for (j=1; j<=num; j++)              {                  sum+=a[i][j];                if(a[i][j]>tmax)                   tmax=a[i][j];                //if(sum>=INF) break;            }              if (sum < minTime)              {                  minTime = sum;                  person = i;                 max=tmax;             }          }          if (minTime != INF)   printf("%d %d\n", person, max);          else                  printf("disjoint\n");      }      return 0;}  

原创粉丝点击