C–最短路
Description
给出一个带权无向图,包含n个点,m条边。求出s,e的最短路。保证最短路存在。
Input
多组输入。
对于每组数据。
第一行输入n,m(1<= n && n<=510^5,1 <= m && m <= 310^6)。
接下来m行,每行三个整数,u,v,w,表示u,v之间有一条权值为w(w >= 0)的边。
最后输入s,e。
Output
对于每组数据输出一个整数代表答案。
Sample
Input
3 1
1 2 3
1 2
Output
3
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
const int N = 6e6 + 10;
int cnt, h[N];
int n, m, u, v, w, x, y;
int dis[N], vis[N];
struct node {
int v, w, next;
} s[N];
void add(int u, int v, int w) {
s[++cnt].v = v;
s[cnt].w = w;
s[cnt].next = h[u];
h[u] = cnt;
}
void SPFA() {
queue<int> q;
memset(vis, 0, sizeof(vis));
memset(dis, inf, sizeof(dis));
dis[x] = 0;
vis[x] = 1;
q.push(x);
while (!q.empty()) {
u = q.front();
q.pop();
vis[u] = 0;
for (int i = h[u]; i; i = s[i].next) {
v = s[i].v;
w = s[i].w;
if (dis[v] > dis[u] + w) {
dis[v] = dis[u] + w;
if (vis[v] == 0) {
q.push(v);
vis[v] = 1;
}
}
}
}
}
int main() {
ios::sync_with_stdio(false);
while (cin >> n >> m) {
cnt = 0;
memset(h, 0, sizeof(h));
for (int i = 0; i < m; i++) {
cin >> u >> v >> w;
add(u, v, w);
add(v, u, w);
}
cin >> x >> y;
SPFA();
cout << dis[y] << '\n';
}
}
另外两种解法模板链接
Dijkstra算法模板
Bellman-Ford算法模板
本文介绍了一种使用C++实现的最短路径算法,通过SPFA算法解决带权无向图中两点间的最短路径问题,并提供完整的代码示例及Dijkstra和Bellman-Ford算法的模板链接。
382

被折叠的 条评论
为什么被折叠?



