Dijkstra算法 - 单个节点到所有节点的最短路

Dijkstra算法 - 单个节点到所有节点的最短路

Dijkstra算法实现

以下是使用priority_queue优化,以及vector保存邻接表的Dijkstra实现,这个需要背下来。

注意实现正确性:要比较priority queue中取出的点的距离是否和距离数组中的一样,以保证每个点只访问一次(下面代码中continue那一行)。 如果不做这个比较,因为点会被多次加入队列,算法会变成O(N2logN)\mathcal{O}(N^2\log{N}),在不少问题上就会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【模板】单源最短路径(标准版)普及/提高-
P2888USACO GoldCow Hurdles普及/提高-
P1144最短路计数普及/提高-
P5663CSP-J加工零件2019普及+/提高
P3956NOIP-J棋盘2017普及+/提高
P1828USACOSweet Butter普及+/提高
P4568JLOI飞行路线2011提高+/省选-解答
P1462通往奥格瑞玛的道路提高+/省选-