1925 - 小道消息
时间限制 : 1 秒
内存限制 : 128 MB
公司老总想把一条小道消息以最快的时间传递给公司的的所有的人。但是每个人自己只把消息传给他认识的人,并且传递给他认识的人也需要一定的时间。请你帮助公司老总策划下首先应该把消息告诉谁,然后消息从这个人开始传播直到所有的人都知道此消息,所需的时间最短。(老总把消息告诉第一人知道消息的人不花时间)
题目输入
第一行一个整数n(1 <= n <= 100)表示公司的人数(老总除外)
接下来n行的第i行。每行开头是一个整数m,表示第i人所认识的人数。之后m对整数xj,tj,表示第i人所认识的人的编号为xj,且把消息传递给他需要tj个时间。(1 <= tj <= 10)
题目输出
输出二个整数:首先应该告诉的人的编号a和告诉他之后所需的时间t,两数字用一个空格隔开。但是如果消息无法全部传到所有人那,输出:“disjointdd”。
输入/输出样例
输入格式
3 2 2 4 3 5 2 1 2 3 6 2 1 2 2 2
输出格式
3 2
C++解答
#include<stdio.h> #include<string.h> #define INF 0xffffff #define Max 100 void Floyd(int map[][Max], int n) { int A[Max][Max]; int i, j, k; for(i = 0; i < n; i++){ for(j = 0; j < n; j++){ A[i][j] = map[i][j]; } } for(k = 0; k < n; k++){ for(i = 0; i < n; i++) for(j = 0; j < n; j++) if(A[i][j] > A[i][k]+A[k][j]) A[i][j] = A[i][k]+A[k][j]; } int min, min_max, yes = 0, x; for(i = 0; i < n; i++){ min_max = 0; for(j = 0; j < n; j++){ if(A[i][j] > min_max) min_max = A[i][j]; } if(min_max < INF)yes = 1; else if(i) continue; if(!i) { x = i; min = min_max; } else if(min_max < min){ x = i; min = min_max; } } if(yes) printf("%d %d\n", x+1, min); else printf("disjoint\n"); } int main() { int n, map[Max][Max], m, x, v; int i, j; scanf("%d", &n); for(i = 0; i < n; i++){ for(j = 0; j < n; j++) if(i != j)map[i][j] = INF; else map[i][j] = 0; } for(i = 0; i < n; i++){ scanf("%d", &m); for(j = 0; j < m; j++){ scanf("%d%d", &x, &v); map[i][x-1] = v; } } Floyd(map, n); return 0; }