最短路徑c++
以下是一個簡單的 C++ 程式,使用 Dijkstra 算法來找到最短路徑:
#include <iostream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;
const int MAXN = 1000;
vector<pair<int, int>> adj[MAXN]; // 鄰接表存儲圖
int dist[MAXN]; // 存儲每個點到起點的距離
bool visited[MAXN]; // 標記節點是否已被訪問過
void dijkstra(int start) {
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq; // 小根堆
pq.push(make_pair(0, start)); // 將起點加入小根堆
dist[start] = 0; // 起點到起點的距離為 0
visited[start] = true; // 將起點標記為已訪問
while (!pq.empty()) {
int u = pq.top().second; // 取出當前最小距離的節點
pq.pop();
for (auto& e : adj[u]) { // 遍歷當前節點的鄰居節點
int v = e.first;
int weight = e.second;
if (dist[v] > dist[u] + weight) { // 如果通過當前節點到鄰居節點的距離更短
dist[v] = dist[u] + weight; // 更新鄰居節點到起點的距離
pq.push(make_pair(dist[v], v)); // 將鄰居節點加入小根堆中
visited[v] = true; // 將鄰居節點標記為已訪問
}
}
}
}
int main() {
int n, m, start;
cin >> n >> m >> start; // 輸入圖的節點數和邊數以及起點編號
for (int i = 0; i < m; i++) {
int u, v, w;
cin >> u >> v >> w; // 輸入一條邊(u, v, w),其中w為邊權值
adj[u].push_back(make_pair(v, w)); // 將這條邊加入起點節點的鄰接表中
adj[v].push_back(make_pair(u, w)); // 將這條邊加入終點節點的鄰接表中(如果起點和終點不是同一個節點)
}
dijkstra(start); // 調用dijkstra算法找到最短路徑並輸出結果
for (int i = 1; i <= n; i++) {
cout << "Distance from " << start << " to " << i << " is " << dist[i] << endl; // 輸出每個點到起點的最短距離
}
return 0;
}
該程式使用鄰接表存儲圖,並使用 Dijkstra 算法來找到最短路徑。在主函式中,首先輸入圖的節點數、邊數和起點編號,然後輸入每條邊的起點、終點和權值。最後調用 dijkstra
函式來找到最短路徑並輸出結果。