以下是用C++实现Dijkstra算法的示例代码:

#include <iostream>
#include <vector>
#include <queue>
#include <limits.h>

using namespace std;

#define INF INT_MAX

// 邻接表存储图
struct Edge {
    int to; // 目标节点
    int weight; // 边权重
    Edge(int t, int w) : to(t), weight(w) {}
};

typedef vector<vector<Edge>> Graph;

vector<int> dijkstra(const Graph& g, int s) {
    int n = g.size();
    vector<int> dist(n, INF); // 存储源节点到各个节点的最短距离
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq; // 小根堆
    dist[s] = 0;
    pq.push(make_pair(0, s));
    while (!pq.empty()) {
        int u = pq.top().second;
        pq.pop();
        for (auto& e : g[u]) {
            int v = e.to;
            int w = e.weight;
            if (dist[v] > dist[u] + w) {
                dist[v] = dist[u] + w;
                pq.push(make_pair(dist[v], v));
            }
        }
    }
    return dist;
}

int main() {
    int n, m, s;
    cin >> n >> m >> s;
    Graph g(n);
    for (int i = 0; i < m; i++) {
        int u, v, w;
        cin >> u >> v >> w;
        g[u].push_back(Edge(v, w));
        g[v].push_back(Edge(u, w)); // 无向图
    }
    vector<int> dist = dijkstra(g, s);
    for (int i = 0; i < n; i++) {
        if (dist[i] == INF) {
            cout << "INF" << endl;
        } else {
            cout << dist[i] << endl;
        }
    }
    return 0;
}

该程序首先定义了一个结构体Edge,用于存储边信息。接着定义了一个邻接表类型Graph,用于存储图的信息。dijkstra函数是实现Dijkstra算法的核心函数,它接受一个邻接表和源节点s,返回一个vector类型的数组,存储源节点到各个节点的最短距离。在函数内部,我们首先初始化距离数组dist,将源节点到各个节点的距离初始化为INF,然后初始化一个小根堆pq,将源节点入队。接着进入主循环,每次从小根堆中取出距离源节点最近的节点u,然后遍历u的所有邻居节点v,更新v的距离,如果距离被更新,则将v入队。最后返回距离数组dist

main函数中,我们首先读入图的信息,然后调用dijkstra函数,得到源节点到各个节点的最短距离。最后输出距离数组dist,如果某个节点的距离为INF,则输出"INF"。

用C++写Dijkstra算法

原文地址: https://www.cveoy.top/t/topic/b9bp 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录