floyd算法,floyd过后查看每个点传播消息需要的时间,把最小的点输出即可。
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> using namespace std; const int maxn = 101; int dist[maxn][maxn]; int n; void init() { memset(dist, -1, sizeof(dist)); for (int i = 0; i < n; i++) { int m; scanf("%d", &m); for (int j = 0; j < m; j++) { int a, b; scanf("%d%d", &a, &b); a--; dist[i][a] = b; } } } void floyd() { for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) if (dist[j][i] != -1) for (int k = 0; k < n; k++) if (dist[i][k] != -1) if (dist[j][k] == -1 || dist[j][k] > dist[j][i] + dist[i][k]) dist[j][k] = dist[j][i] + dist[i][k]; } void work() { int ans = 1000000000, ansi = -1; for (int i = 0; i < n; i++) { bool ok = true; int maxdist = 0; for (int j = 0; j < n; j++) { if (i == j) continue; if (dist[i][j] == -1) { ok = false; break; } if (maxdist < dist[i][j]) maxdist = dist[i][j]; } if (maxdist < ans && ok) { ans = maxdist; ansi = i; } } if (ansi == -1) printf("disjoint\n"); else printf("%d %d\n", ansi + 1, ans); } int main() { //freopen("D:\\t.txt", "r", stdin); while (scanf("%d", &n) != EOF && n != 0) { init(); floyd(); work(); } return 0; }