Dijkstra算法 - 单个节点到所有节点的最短路
Dijkstra算法实现
以下是使用priority_queue优化,以及vector保存邻接表的Dijkstra实现,这个需要背下来。
注意实现正确性:要比较priority queue中取出的点的距离是否和距离数组中的一样,以保证每个点只访问一次(下面代码中continue
那一行)。
如果不做这个比较,因为点会被多次加入队列,算法会变成,在不少问题上就会TLE。
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> pi;
vector<pi> G[100005];
int n, m, s;
int dist[100005];
int main()
{
cin >> n >> m >> s;
s--; // change to 0-base
for(int i=0; i < m; i++){
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
a--, b--;
G[a].push_back({b,c});
}
priority_queue<pi, vector<pi>, greater<pi>> q;
q.push({0,s});
fill(dist, dist+n, 1e9);
dist[s] = 0;
while (!q.empty()) {
int u = q.top().second, du = q.top().first;
q.pop();
if (du != dist[u]) continue;
for (auto p: G[u]) {
int v = p.first, dv = p.second;
if (dist[u] + dv < dist[v]) {
dist[v] = dist[u] + dv;
q.push({dist[v], v});
}
}
}
for(i=0; i < n; i++)
cout << dist[i] == 1e9 ? -1 : dist[i] << ' ';
return 0;
}
习题 | ||||||
---|---|---|---|---|---|---|
P3371 | 【模板】单源最短路径(弱化版) | 普及/提高- | ||||
P4779 | 【模板】单源最短路径(标准版) | 普及/提高- | ||||
P2888 | USACO Gold | Cow Hurdles | 普及/提高- | |||
P1144 | 最短路计数 | 普及/提高- | ||||
P5663 | CSP-J | 加工零件 | 2019 | 普及+/提高 | ||
P3956 | NOIP-J | 棋盘 | 2017 | 普及+/提高 | ||
P1828 | USACO | Sweet Butter | 普及+/提高 | |||
P4568 | JLOI | 飞行路线 | 2011 | 提高+/省选- | 解答 | |
P1462 | 通往奥格瑞玛的道路 | 提高+/省选- |