设图中顶点表示村庄,有向边代表交通路线。若要建立一家医院,试问这家医院建在哪一个村庄使各村庄到医院总体上的交通代价最小。 要求:(1) 有向图采用邻接矩阵的形式存储; (2)设计算法解决这个问题,输出医院地址,以及各村庄到医院的交通代价。 提交作业包括:完整的程序代码、程序说明报告。 程序说明报告要求: 给出算法的基本设计思想; 根据设计思想,采用程序设计语言描述算法(C或者C++等),关键之处给出注释; 程序运行结果示例。
时间: 2024-02-22 17:56:52 浏览: 113
算法设计思想:
1. 首先将有向图采用邻接矩阵的形式存储,即建立一个二维数组来表示各个村庄之间的交通情况,其中数组元素值表示为村庄之间的交通代价;
2. 假设医院建立在第一个村庄,即村庄1,计算出各个村庄到医院的交通总代价;
3. 在假设的情况下,依次考虑将医院建立在其他村庄,重新计算各个村庄到医院的交通总代价;
4. 比较各个情况下的交通总代价,找到最小值对应的医院地址。
程序实现:
```c++
#include <iostream>
#define MAX 100
using namespace std;
int map[MAX][MAX]; // 邻接矩阵
int n; // 村庄数
void init() {
cout << "请输入村庄数:";
cin >> n;
cout << "请输入邻接矩阵:\n";
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
cin >> map[i][j];
}
}
}
void hospital() {
int sum = 0;
int minSum = __INT_MAX__;
int addr;
for(int i = 1; i <= n; i++) {
sum = 0;
for(int j = 1; j <= n; j++) {
sum += map[j][i];
}
if(sum < minSum) {
minSum = sum;
addr = i;
}
}
cout << "医院地址:" << addr << endl;
cout << "各村庄到医院的交通代价:\n";
for(int i = 1; i <= n; i++) {
cout << "村庄" << i << "到医院的交通代价:" << map[i][addr] << endl;
}
}
int main() {
init();
hospital();
return 0;
}
```
程序运行结果示例:
请输入村庄数:5
请输入邻接矩阵:
0 2 1 4 5
0 0 4 2 3
0 0 0 5 6
0 0 0 0 4
0 0 0 0 0
医院地址:1
各村庄到医院的交通代价:
村庄1到医院的交通代价:0
村庄2到医院的交通代价:2
村庄3到医院的交通代价:1
村庄4到医院的交通代价:4
村庄5到医院的交通代价:5
阅读全文