输入格式: 第一行包含两个整数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 20:44:06 浏览: 89
以下是C++代码实现,与上题类似,只需要在添加边的时候判断是否加入该边即可:
```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;
if (a == 1 || b == 1) { // 如果A或B是刘老板,不加入该边
continue;
}
graph[a][b] = graph[b][a] = c; // 添加双向边
}
dijkstra(1);
if (dist[n] == INF) {
cout << "Fail\n";
} else {
cout << dist[n] << endl;
}
return 0;
}
```
需要注意的是,由于本题中只需要去掉一条边,可能存在加入一些边后图不连通的情况,这时候需要判断起点能否到达终点,如果不能,输出"Fail"。
阅读全文