Dijkstra算法的C++实现

Dijkstra算法简介:

Dijkstra算法,即迪杰斯特拉算法,是由荷兰计算机科学家艾兹赫尔·迪杰斯特拉在1956年提出的,用于解决带权有向图中的单源最短路径问题。算法的主要思想是:从起点开始,逐步扩展到离起点最近的节点,直到到达目标节点或所有可达节点都被访问过。

该算法具有如下优势:

对于非负权图,迪杰斯特拉算法能高效找到最短路径

总能找到从起点到其他所有节点的最短路径

代码实现:

#include <iostream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;

typedef pair<int, int> pii;

vector<int> dijkstra(const vector<vector<pii>>& graph, int start) {
    int n = graph.size();
    vector<int> dist(n, INT_MAX);
    priority_queue<pii, vector<pii>, greater<pii>> pq;
    
    dist[start] = 0;
    pq.push({0, start});
    
    while (!pq.empty()) {
        int u = pq.top().second;
        int current_dist = pq.top().first;
        pq.pop();
        
        if (current_dist > dist[u]) continue;
        
        for (const auto& edge : graph[u]) {
            int v = edge.first;
            int weight = edge.second;
            
            if (dist[v] > dist[u] + weight) {
                dist[v] = dist[u] + weight;
                pq.push({dist[v], v});
            }
        }
    }
    
    return dist;
}

int main() {
    int n = 5;
    vector<vector<pii>> graph(n);
    
    graph[0].push_back({1, 4});
    graph[0].push_back({2, 1});
    graph[1].push_back({3, 1});
    graph[2].push_back({1, 2});
    graph[2].push_back({3, 5});
    graph[3].push_back({4, 3});
    
    vector<int> dist = dijkstra(graph, 0);
    
    for (int i = 0; i < n; ++i) {
        cout << "Distance from 0 to " << i << " is " << dist[i] << endl;
    }
    
    return 0;
}

样例截图:

 

总结与思考:

Dijkstra算法采用了贪心的思想,每次选择当前最优的局部解,最终能够获得全局最优解。这提醒我们在某些问题中,局部最优的累积确实可以导向全局最优。同时该算法通过逐步扩展已知最短路径的集合,展示了复杂问题可以分解为一系列简单步骤来解决的思路。除此之外,Dijkstra算法还使用优先队列处理节点,这体现出了"重要的事情优先处理"的管理哲学,这种思维方式可以应用于许多生活和工作场景。但Dijkstra算法仅适用于非负权图,这提醒我们任何方法都有其适用范围和限制条件,理解这些边界至关重要。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值