Dijkstra
从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。从起点开始,采用贪心算法策略,每次遍历到始点距离最近且未被访问过的顶点,直到终点。该图中不存在负权边。
c++实现:
#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 << " 到各节点的最短距离:\n"; for(int i=0;i < dist.size();++i) { if(dist[i] == INT_MAX) std::cout << " 节点 " << i << " \t connot arrive\n"; else std::cout << " 节点 " << 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); }

浙公网安备 33010602011771号