C++图中顶点表示村庄,有向边代表交通路线。若要建立一家医院,问这家医院建在哪一个村庄使各村庄到医院总体上的交通代价最小。 要求:(1) 有向图采用邻接矩阵的形式存储; (2)输出医院地址,以及各村庄到医院的交通代价。
时间: 2024-02-12 10:05:49 浏览: 23
好的,以下是 C++ 代码实现,也是基于 Floyd 算法:
```c++
#include <iostream>
#include <climits>
using namespace std;
const int MAX = 100;
int graph[MAX][MAX]; // 邻接矩阵
// Floyd 算法求解最短路径
void floyd(int n) {
for (int k = 0; k < n; k++) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (graph[i][k] != INT_MAX && graph[k][j] != INT_MAX && graph[i][j] > graph[i][k] + graph[k][j]) {
graph[i][j] = graph[i][k] + graph[k][j];
}
}
}
}
}
int main() {
int n = 4; // 顶点数
int hospital; // 医院地址
// 初始化邻接矩阵
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i == j) {
graph[i][j] = 0;
} else {
graph[i][j] = INT_MAX;
}
}
}
graph[0][1] = 5;
graph[0][3] = 10;
graph[1][2] = 3;
graph[2][3] = 1;
floyd(n); // 求解最短路径
int min_cost = INT_MAX;
for (int i = 0; i < n; i++) {
int sum_cost = 0;
for (int j = 0; j < n; j++) {
sum_cost += graph[i][j];
}
if (sum_cost < min_cost) {
min_cost = sum_cost;
hospital = i;
}
}
// 输出结果
cout << "最佳医院位置:" << hospital << endl;
for (int i = 0; i < n; i++) {
if (i == hospital) {
continue;
}
cout << "村庄 " << i << " 到医院的最短路径和代价:" << graph[i][hospital] << endl;
}
return 0;
}
```
在这个代码中,我们先构建了一个邻接矩阵,表示各个村庄间的交通情况。然后采用 Floyd 算法求解最短路径,并计算出每个村庄到其他村庄的总代价。最后找到总代价最小的村庄作为最佳医院位置,并输出每个村庄到该医院的最短路径及其代价。