Dijkstra
從一個頂點到其余各頂點的最短路徑算法,解決的是有權(quán)圖中最短路徑問題。從起點開始,采用貪心算法策略,每次遍歷到始點距離最近且未被訪問過的頂點,直到終點。該圖中不存在負權(quán)邊。
c++實現(xiàn):
#include <vector> #include <queue> #include <climits> #include <iostream> // assume there is a graphics with direction and side weight // weight node using SideWeight = std::pair<int,int>; using Graph = std::vector<std::vector<SideWeight>>; std::vector<int> dijkstra(const Graph &graph, int start) { int n = graph.size(); std::vector<int> dist(n, INT_MAX); // restore the shortest distance std::vector<bool> visited(n, false); // remember visit status std::priority_queue<SideWeight, std::vector<SideWeight>, std::greater<SideWeight>> pq; dist[start] = 0; pq.push({0, start}); while(!pq.empty()) { auto [d,u]=pq.top(); pq.pop(); if(visited[u]) { continue; } visited[u] = true; for(auto &[weight ,v] : graph[u]) { if(dist[v] > dist[u] + weight) { dist[v] = dist[u] + weight; pq.push({dist[v], v}); } } } return dist; } void printRes(const std::vector<int>& dist, int start) { std::cout << "From start point: " << start << " 到各節(jié)點的最短距離:\n"; for(int i=0;i < dist.size();++i) { if(dist[i] == INT_MAX) std::cout << " 節(jié)點 " << i << " \t connot arrive\n"; else std::cout << " 節(jié)點 " << i << " \t shortest distance: " << dist[i] << std::endl; } } void Test() { Graph graph; graph.reserve(5); std::vector<SideWeight> v1; v1.emplace_back(2,1); v1.emplace_back(4,2); graph.emplace_back(v1); std::vector<SideWeight> v2; v2.emplace_back(1,2); v2.emplace_back(7,3); graph.emplace_back(v2); std::vector<SideWeight> v3; v3.emplace_back(3,4); graph.emplace_back(v3); std::vector<SideWeight> v4; v4.emplace_back(1,5); graph.emplace_back(v4); std::vector<SideWeight> v5; v5.emplace_back(2,3); v5.emplace_back(5,5); graph.emplace_back(v5); auto dist = dijkstra(graph,0); printRes(dist, 0); }

浙公網(wǎng)安備 33010602011771號