输入格式: 第一行包含两个整数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 17:43:26 浏览: 81
以下是C++代码实现:
```c++
#include <iostream>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
const int N = 35, INF = 0x3f3f3f3f;
int n, m, dis[N], vis[N], cnt[N];
struct Edge {
int v, w;
};
vector<Edge> g[N];
bool spfa() {
memset(dis, 0x3f, sizeof(dis));
memset(cnt, 0, sizeof(cnt));
memset(vis, 0, sizeof(vis));
dis[1] = 0, vis[1] = true;
queue<int> q;
q.push(1);
while (!q.empty()) {
int u = q.front();
q.pop(), vis[u] = false;
for (int i = 0; i < g[u].size(); i++) {
int v = g[u][i].v, w = g[u][i].w;
if (dis[v] > dis[u] + w) {
dis[v] = dis[u] + w;
if (!vis[v]) {
q.push(v);
vis[v] = true;
cnt[v]++;
if (cnt[v] >= n)
return false;
}
}
}
}
return dis[n] != INF;
}
int main() {
cin >> n >> m;
while (m--) {
int u, v, w;
cin >> u >> v >> w;
g[u].push_back({v, w});
g[v].push_back({u, w});
}
if (!spfa())
cout << "Fail" << endl;
else
cout << dis[n] << endl;
return 0;
}
```
阅读全文