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);
}

 

posted @ 2025-03-20 11:00  北冥没有鱼  Views(11)  Comments(0)    收藏  举报