提交时间:2025-05-27 14:26:51
运行 ID: 193896
#include <iostream> #include <vector> #include <climits> using namespace std; const int MAXN = 105; int population[MAXN]; int dist[MAXN][MAXN]; int main() { int n; cin >> n; // 初始化距离矩阵 for (int i = 1; i <= n; ++i) { for (int j = 1; j <= n; ++j) { if (i == j) { dist[i][j] = 0; } else { dist[i][j] = INT_MAX / 2; // 避免溢出 } } } // 读取输入并构建邻接关系 for (int i = 1; i <= n; ++i) { int left, right; cin >> population[i] >> left >> right; if (left != 0) { dist[i][left] = 1; dist[left][i] = 1; } if (right != 0) { dist[i][right] = 1; dist[right][i] = 1; } } // Floyd-Warshall算法计算所有点对之间的最短路径 for (int k = 1; k <= n; ++k) { for (int i = 1; i <= n; ++i) { for (int j = 1; j <= n; ++j) { if (dist[i][k] + dist[k][j] < dist[i][j]) { dist[i][j] = dist[i][k] + dist[k][j]; } } } } // 计算每个节点作为医院的总路程,并找出最小值 int min_sum = INT_MAX; for (int i = 1; i <= n; ++i) { int sum = 0; for (int j = 1; j <= n; ++j) { sum += population[j] * dist[j][i]; } if (sum < min_sum) { min_sum = sum; } } cout << min_sum << endl; return 0; }