最短路(Spfa)
描述
给定 M 条边, N 个点的带权无向图。求 1到 N 的最短路。
输入
第一行:N,M(N≤100000,M≤500000);接下来M行3个正整数:ai,bi,ci表示ai,bi之间有一条长度为ci的路,ci≤1000。
输出
一个整数,表示 1 到 N 的最短距离。
输入样例 1
4 4 1 2 1 2 3 1 3 4 1 2 4 1
输出样例 1
2
#include <iostream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;
struct Edge {
int to;
int weight;
};
vector<vector<Edge>> adj;
vector<int> dist;
vector<bool> inQueue;
void spfa(int start) {
queue<int> q;
q.push(start);
inQueue[start] = true;
dist[start] = 0;
while (!q.empty()) {
int u = q.front();
q.pop();
inQueue[u] = false;
for (const auto& edge : adj[u]) {
int v = edge.to;
int w = edge.weight;
if (dist[u] + w < dist[v]) {
dist[v] = dist[u] + w;
if (!inQueue[v]) {
q.push(v);
inQueue[v] = true;
}
}
}
}
}
int main() {
int n, m;
cin >> n >> m;
adj.resize(n + 1);
dist.resize(n + 1, INT_MAX);
inQueue.resize(n + 1, false);
for (int i = 0; i < m; ++i) {
int a, b, c;
cin >> a >> b >> c;
adj[a].push_back({b, c});
adj[b].push_back({a, c});
}
spfa(1);
cout << dist[n] << endl;
return 0;
}