用c++写出有一个n 个点 m 条边的无向图,请求出从 s 到 t 的最短路长度代码
时间: 2024-02-25 07:58:19 浏览: 137
一个用C++写的求最短路径的代码
5星 · 资源好评率100%
以下是使用 Dijkstra 算法求解最短路的 C++ 代码实现:
```c++
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
const int MAXN = 1005;
const int INF = 0x3f3f3f3f;
int n, m, s, t;
vector<pair<int, int>> adj[MAXN];
int dist[MAXN];
bool vis[MAXN];
void dijkstra(int s) {
memset(dist, INF, sizeof(dist));
memset(vis, false, sizeof(vis));
dist[s] = 0;
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
pq.push(make_pair(0, s));
while (!pq.empty()) {
int u = pq.top().second;
pq.pop();
if (vis[u]) continue;
vis[u] = true;
for (int i = 0; i < adj[u].size(); ++i) {
int v = adj[u][i].first;
int w = adj[u][i].second;
if (dist[v] > dist[u] + w) {
dist[v] = dist[u] + w;
pq.push(make_pair(dist[v], v));
}
}
}
}
int main() {
cin >> n >> m >> s >> t;
for (int i = 1; i <= m; ++i) {
int u, v, w;
cin >> u >> v >> w;
adj[u].push_back(make_pair(v, w));
adj[v].push_back(make_pair(u, w));
}
dijkstra(s);
cout << dist[t] << endl;
return 0;
}
```
其中 adj[] 存储了邻接表,dist[] 存储了起点到每个点的最短距离,vis[] 表示该点是否已经被访问过。优先队列 pq 存储了 (dis, u),表示起点到 u 的距离为 dis。在 dijkstra 函数中,先将起点 s 的距离设为 0,其余点的距离设为正无穷。然后将起点 s 加入队列 pq,当队列不为空时,取出队首元素 (dis, u),如果 u 的距离已经被更新,直接跳过。否则,更新 u 的距离为 dis,并遍历 u 的所有邻接点 v,如果起点到 v 的距离可以被更新,将 (dis+cost(u, v), v) 加入队列 pq。最终返回 dist[t],即为起点到 t 的最短路长度。
阅读全文