请用C++代码实现:题目描述 给一个 � ( 1 ≤ � ≤ 1 0 6 ) n(1≤n≤10 6 ) 个点 � ( 1 ≤ � ≤ 1 0 6 ) m(1≤m≤10 6 ) 条边的无向图,求 � s 到 � t 的最短路的长度。 数据保证, � s 出发可以到达 � t。 Input 请从 stdin 读入。注意,输入可能很大 ( > 10 M B ) (>10MB)。 第一行为四个正整数 � , � , � , � n,m,s,t。 第二行起 � m 行,每行三个非负整数 � � , � � , � � ( 0 ≤ � � ≤ 1 ) u i ,v i ,w i (0≤w i ≤1),表示从 � � u i 到 � � v i 有一条权值为 � � w i 的无向边。 Output 请输出到 stdout 中。 输出一行一个整数,表示 � s 到 � t 的距离。
时间: 2023-12-23 07:02:42 浏览: 181
c++ 无向图求度
以下是使用 Dijkstra 算法实现最短路径的 C++ 代码:
```cpp
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
const int MAXN = 1e6 + 5;
const int INF = 0x3f3f3f3f;
struct Edge {
int to, w;
};
vector<Edge> graph[MAXN];
int dist[MAXN];
bool visited[MAXN];
void dijkstra(int s) {
memset(dist, INF, sizeof(dist));
memset(visited, false, sizeof(visited));
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 (visited[u]) continue;
visited[u] = true;
for (int i = 0; i < graph[u].size(); i++) {
int v = graph[u][i].to, w = graph[u][i].w;
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 <= m; i++) {
int u, v, w;
cin >> u >> v >> w;
graph[u].push_back({v, w});
graph[v].push_back({u, w});
}
dijkstra(s);
cout << dist[t] << endl;
return 0;
}
```
该算法的时间复杂度为 $O(m\log n)$,其中 $n$ 和 $m$ 分别是点和边的数量。
阅读全文