最短路算法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: "; // 可以使用其他方式驗證結果是否正確,這裡只輸出了最短路徑並等待用戶確認輸出是否正確(如果有需要也可以在控制台輸出更詳細