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算法仅适用于非负权图,这提醒我们任何方法都有其适用范围和限制条件,理解这些边界至关重要。