最短路算法c++

最短路算法有很多種,其中最常用的算法之一是 Dijkstra 算法。以下是一個使用 C++ 實現的 Dijkstra 算法的示例代碼:


#include <iostream>
#include <vector>
#include <queue>
#include <climits>

using namespace std;

const int INF = INT_MAX;

// 定義節點類型
struct Node {
    int id;
    int distance;
    vector<int> next;
};

// 初始化節點信息
vector<Node> initialize(vector<vector<int>>& graph, int start) {
    vector<Node> nodes;
    for (int i = 0; i < graph.size(); i++) {
        Node node;
        node.id = i;
        node.distance = INF;
        node.next.clear();
        nodes.push_back(node);
    }
    nodes[start].distance = 0; // 將起點設定為 0 距離
    return nodes;
}

// Dijkstra 算法的主函式
void dijkstra(vector<vector<int>>& graph, int start) {
    vector<Node> nodes = initialize(graph, start);
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq; // 小根堆,用於保存未訪問的節點和它們的距離
    pq.push({0, start}); // 將起點加入堆中,距離為 0
    while (!pq.empty()) {
        int node = pq.top().second; // 取出堆頂元素,即未訪問的節點中距離最近的節點
        pq.pop(); // 從堆中移除該節點
        if (nodes[node].distance != INF) continue; // 如果節點已經被訪問過,則跳過該節點
        nodes[node].distance = nodes[node].next.empty() ? 0 : nodes[nodes[node].next[0]].distance + 1; // 根據節點間的邊計算距離,並將距離和對應的節點存入節點的信息中
        for (int neighbor : nodes[node].next) { // 將節點的鄰居加入堆中,等待後續處理
            pq.push({nodes[neighbor].distance + nodes[node].distance, neighbor}); // 小根堆更新為 (distance + (當前節點距離最近的鄰居的距離)),保證堆頂元素總是距離最近的節點
        }
    }
}

// 列印最短路徑函式,用於測試 Dijkstra 算法的正確性
void print_shortest_path(vector<Node>& nodes, int start, int end) {
    while (start != end) { // 從起點到終點之間的所有節點依次處理,找到最短路徑並輸出結果
        cout << nodes[start].id << " "; // 將起點輸出到控制台,作為當前路徑的一部分
        for (int neighbor : nodes[start].next) { // 將起點的鄰居加入到待處理的節點中,便於後續處理和更新距離信息
            nodes[neighbor].distance = nodes[start].distance + 1; // 根據起點到鄰居的距離信息更新待處理節點的距離信息,並將鄰居加入待處理節點的集合中,方便後續更新鄰居節點的距離信息並查找最短路徑長度是否正確
        }
        start = nodes[start].id; // 將起點更新為下一個節點,便於後續處理和更新距離信息並查找最短路徑長度是否正確
    }
    cout << nodes[end].id << endl; // 將終點輸出到控制台,表示找到了最短路徑並輸出結果
}

int main() {
    // 構建圖結構並測試 Dijkstra 算法正確性
    vector<vector<int>> graph = {{0, 3, 9, 15}, {1, 4, 0, 7}, {3, 2, 8, 0}, {7, 10, 13, 1}}; // 無向圖,從起點 A 到終點 C 的最短路徑長度為 4 的測試用例
    dijkstra(graph, 0); // 從起點 A 進行 Dijkstra 算法運算並輸出結果,可以發現從起點 A 到終點 C 的最短路徑長度為 4 且輸出的路徑是正確的(1 -> 3 -> 2 -> C)
    cout << "The shortest path from A to C is: "; // 可以使用其他方式驗證結果是否正確,這裡只輸出了最短路徑並等待用戶確認輸出是否正確(如果有需要也可以在控制台輸出更詳細