http://poj.org/problem?id=1125
题意:
首先,题目可能有多组测试数据,每个测试数据的第一行为经纪人数量N(当N=0时, 输入数据结束),然后接下来N行描述第i(1<=i<=N)个经纪人与其他经纪人的关系 (教你如何画图)。每行开头数字M为该行对应的经纪人有多少个经纪人朋友(该节点 的出度,可以为0),然后紧接着M对整数,每对整数表示成a,b,则表明该经纪人向第a 个经纪人传递信息需要b单位时间(即第i号结点到第a号结点的孤长为b),整张图为 有向图,即弧Vij 可能不等于弧Vji。当构图完毕后,求 当从该图中某点出发,将“消息”传播到整个经纪人网络的最小时间,输出这个经纪 人号和最小时间。最小时间的判定方式为——从这个经纪人(结点)出发,整个经纪 人网络中最后一个人接到消息的时间。如果有一个或一个以上经纪人无论如何无法收 到消息,输出“disjoint”。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<stdio.h> 2 #include<string.h> 3 const int INF=1<<28; 4 int dis[105][105],n; 5 void init() 6 { 7 for (int i = 0; i <= n; i ++) 8 { 9 for (int j = 0; j <= n; j ++) 10 { 11 dis[i][j] = INF; 12 } 13 dis[i][i] = 0; 14 } 15 } 16 void floyd() 17 { 18 for (int k = 1; k <= n; k++) 19 { 20 for (int i = 1; i <= n; i ++) 21 { 22 for (int j = 1; j <= n; j ++) 23 { 24 if (dis[i][j] > dis[i][k] + dis[k][j]) 25 dis[i][j] = dis[i][k] + dis[k][j]; 26 } 27 } 28 } 29 } 30 int main() 31 { 32 while(~scanf("%d",&n)&&n) 33 { 34 init(); 35 for (int i =1; i <= n; i++) 36 { 37 int m,j,time; 38 scanf("%d",&m); 39 while(m--) 40 { 41 scanf("%d%d",&j,&time); 42 dis[i][j] = time; 43 } 44 } 45 floyd(); 46 int flag = 0,temp = INF; 47 for (int i = 1; i <= n; i++) 48 { 49 int max = 0; 50 for (int j = 1; j <= n; j++) 51 { 52 if (dis[i][j] > max) 53 max = dis[i][j]; 54 } 55 if (temp > max) 56 { 57 flag = i; 58 temp = max; 59 } 60 61 } 62 if (flag) 63 printf("%d %d ",flag,temp); 64 else 65 printf("disjoint "); 66 } 67 return 0; 68 }