迪杰斯特拉输入格式: 第一行包含两个整数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 19:44:16 浏览: 115
以下是使用 Dijkstra 算法来解决该问题的示例代码(使用 C++ 实现):
```c++
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
const int N = 35, INF = 0x3f3f3f3f;
int n, m;
int g[N][N];
bool vis[N];
int dist[N];
void dijkstra()
{
memset(dist, 0x3f, sizeof(dist));
dist[1] = 0;
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q;
q.push({0, 1});
while (!q.empty())
{
int t = q.top().second;
q.pop();
if (vis[t])
continue;
vis[t] = true;
for (int i = 1; i <= n; i++)
{
if (g[t][i] && !vis[i] && dist[t] + g[t][i] < dist[i])
{
dist[i] = dist[t] + g[t][i];
q.push({dist[i], i});
}
}
}
}
int main()
{
cin >> n >> m;
memset(g, 0x3f, sizeof(g));
while (m--)
{
int a, b, c;
cin >> a >> b >> c;
g[a][b] = g[b][a] = c;
}
dijkstra();
if (dist[n] == INF)
cout << "Fail" << endl;
else
cout << dist[n] << endl;
return 0;
}
```
在这个代码中,我们使用了邻接矩阵 `g` 来存储图的边权信息,使用了一个布尔数组 `vis` 来表示每个节点是否已经加入了最短路径树,使用了一个数组 `dist` 来记录刘老板到每个节点的最短路径长度。在算法的实现中,我们使用了一个最小堆来实现 Dijkstra 算法的优化,从而提高算法的效率。
最后,如果最短路径树中包含了从刘老板到校长的路径,就输出刘老板到校长的最短路径长度;否则输出“Fail”。
阅读全文