输入格式: 第一行包含两个整数n和m,n为关系网中的人数。 编号从1至n,刘老板是第1位,校长是第n位。M表示刘老板的关系网中有M个关系。(3 <n= 30, 3<=m <=1000) 接下来有m行。每行包含三个整数A、B和C,意思是A和B之间存在关系,如果A向B或B向A求助,刘老板将支付C元。 输出格式: 在你尽了最大努力后,输出Boss Liu要花的最少的钱。如果Boss Liu不能把他的孩子送到大学,就打印“Fail”。c++数组模拟图表
时间: 2024-03-12 10:44:04 浏览: 99
以下是C++代码实现,使用了邻接矩阵存储图表和Dijkstra算法求最短路径:
```c++
#include <iostream>
#include <cstring>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN = 35;
const int MAXM = 1005;
int n, m;
int graph[MAXN][MAXN]; // 邻接矩阵存储图表
int dist[MAXN]; // 记录起点到每个点的最短距离
bool visited[MAXN]; // 记录每个点是否已经被访问
void dijkstra(int start) {
memset(visited, false, sizeof(visited));
memset(dist, INF, sizeof(dist));
dist[start] = 0;
for (int i = 0; i < n; i++) {
int u = -1;
for (int j = 1; j <= n; j++) { // 找到未访问过的距离最小的点
if (!visited[j] && (u == -1 || dist[j] < dist[u])) {
u = j;
}
}
if (u == -1) return; // 找不到未访问过的点了,退出
visited[u] = true;
for (int v = 1; v <= n; v++) { // 更新与u相邻的点的距离
if (graph[u][v] != INF && dist[u] + graph[u][v] < dist[v]) {
dist[v] = dist[u] + graph[u][v];
}
}
}
}
int main() {
memset(graph, INF, sizeof(graph));
cin >> n >> m;
while (m--) {
int a, b, c;
cin >> a >> b >> c;
graph[a][b] = graph[b][a] = c; // 添加双向边
}
dijkstra(1);
if (dist[n] == INF) {
cout << "Fail\n";
} else {
cout << dist[n] << endl;
}
return 0;
}
```
注意,题目中的编号从1开始,而不是0,需要特别注意边界。
阅读全文