c++代码,详细解释。题目描述 有一个 n 个点 m 条边的无向图,请求出从 s 到 t 的最短路长度。 输入格式 第一行四个正整数 n,m,s,t。 接下来 m 行,每行三个正整数 u,v,w,表示一条连接 u,v长为 w 的边。 输出格式 输出一行一个整数,表示答案。
时间: 2024-02-06 19:11:01 浏览: 127
好的,这是一个经典的最短路径问题,可以使用 Dijkstra 算法或者 Bellman-Ford 算法来解决。下面是 Dijkstra 算法的 C++ 代码实现:
```c++
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int INF = 0x3f3f3f3f;
struct Edge {
int to, weight;
Edge(int t, int w) : to(t), weight(w) {}
};
vector<Edge> adj[100005];
int dist[100005];
void dijkstra(int s) {
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
pq.push(make_pair(0, s));
dist[s] = 0;
while (!pq.empty()) {
int u = pq.top().second;
int d = pq.top().first;
pq.pop();
if (d > dist[u]) continue;
for (const auto& e : adj[u]) {
int v = e.to;
int w = e.weight;
if (dist[v] > dist[u] + w) {
dist[v] = dist[u] + w;
pq.push(make_pair(dist[v], v));
}
}
}
}
int main() {
int n, m, s, t;
cin >> n >> m >> s >> t;
// 初始化
for (int i = 1; i <= n; i++) {
dist[i] = INF;
}
// 构建邻接表
for (int i = 1; i <= m; i++) {
int u, v, w;
cin >> u >> v >> w;
adj[u].push_back(Edge(v, w));
adj[v].push_back(Edge(u, w));
}
dijkstra(s);
cout << dist[t] << endl;
return 0;
}
```
代码解释如下:
1. 定义结构体 Edge,表示图中的一条边,包括 to 表示边的终点和 weight 表示边的权重。
2. 定义邻接表 adj,表示图中每个节点连出去的边。
3. 定义 dist 数组,表示从源点 s 到每个节点的最短距离。
4. 实现 Dijkstra 算法,使用优先队列来维护当前最短距离最小的节点。
5. 主函数中读入图的信息,包括节点数、边数、起点和终点,构建邻接表并调用 dijkstra 函数求解最短路径长度,最后输出结果。
需要注意的是,在代码中我使用了 INF 表示无穷大,使用了 priority_queue 来实现优先队列,使用了 vector 来实现邻接表。
阅读全文