Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
193896 | luckypet | 医院设置 | C++ | 通过 | 100 | 1 MS | 300 KB | 1615 | 2025-05-27 14:26:51 |
#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; }