求一个网络中,从哪一点连接开始,到其他所有点的最长距离。就是求某点开始到其他点最长距离的最小值。 #include <iostream> #include <cstring> #include <cstdio> using namespace std; const int inf = 100; // 最大10 int n; // 总人数 int path[101][101]; void floyd() { for (int k = 1; k <= n; ++k) for (int i = 1; i <= n; ++i) // 因为不是无向图或正权双向图,所以不能用for (int i=1; i<=n-1; ++i) for (int j=i+1; j<=n; ++j) for (int j = 1; j <= n; ++j) if (i != j && path[i][j] > path[i][k] + path[k][j]) //要不在这弄一个i!=j,要不path[i][i]=0 path[i][j] = path[i][k] + path[k][j]; int node, maxlen, minmaxlen = 100000; for (int i = 1; i <= n; ++i) { maxlen = 0; for (int j = 1; j <= n; ++j) { if (i != j && path[i][j] > maxlen) { maxlen = path[i][j]; //i点到所有其他点的最大长度 } } if (maxlen < minmaxlen) { minmaxlen = maxlen; node = i; } } if (minmaxlen < 100) cout << node << ' ' << minmaxlen << endl; else cout << "disjoint" << endl; } int main() { //freopen("temp.txt", "r", stdin); while (cin >> n && n) { memset(path, 1, sizeof(path)); for (int i = 1; i <= n; ++i) { int pair; // 每个人有pair个联系人 cin >> pair; int contact, time; for (int j = 1; j <= pair; ++j) { cin >> contact >> time; path[i][contact] = time; } } floyd(); } return 0; }