单源最短路径问题的贪心算法(Dijkstra)并用C++语言写出代码
时间: 2024-12-11 11:33:47 浏览: 47
**单源最短路径问题的贪心算法(Dijkstra算法)概述:**
Dijkstra算法是一种贪心策略,主要用于寻找带权重的无向图中从一个指定顶点(源)到其他顶点的最短路径。它通过维护一个优先级队列来不断选择当前未发现的最短路径起点,直到所有可达节点都被访问过。每次选择距离最小的节点并更新其相邻节点的距离,直到目标节点达到。
以下是C++实现Dijkstra算法的基本步骤:
```cpp
#include <iostream>
#include <vector>
#include <queue>
#include <limits.h>
using namespace std;
struct Node {
int dist;
int index;
};
bool compareNodes(Node a, Node b) {
return a.dist < b.dist;
}
void dijkstra(vector<pair<int, int>>& graph, int src, vector<int>& distances, vector<bool>& visited) {
int n = graph.size();
priority_queue<Node, vector<Node>, decltype(compareNodes)> pq(compareNodes);
distances[src] = 0;
pq.push({0, src});
while (!pq.empty()) {
Node current = pq.top();
pq.pop();
if (visited[current.index])
continue;
visited[current.index] = true;
for (auto &neighbour : graph[current.index]) {
int weight = neighbour.first; // 边的权重
int neighbourNode = neighbour.second; // 目标节点
if (!visited[neighbourNode]) {
int newDist = distances[current.index] + weight;
if (newDist < distances[neighbourNode]) {
distances[neighbourNode] = newDist;
pq.push({newDist, neighbourNode});
}
}
}
}
}
int main() {
// 程序实例化输入数据...
vector<pair<int, int>> graph;
int src;
// ...假设这里已经初始化好graph和src变量
vector<int> distances(n, INT_MAX);
vector<bool> visited(n, false);
dijkstra(graph, src, distances, visited);
for (int i = 0; i < n; ++i)
cout << "Shortest distance from node " << src << " to node " << i << ": " << distances[i] << endl;
return 0;
}
```
在这个代码中,`graph`是一个邻接表表示的图,`src`是源节点,`distances`数组记录了每个节点到源的最短距离,`visited`数组标记节点是否已处理。注意,这个实现假设图中没有负权重边,如果有负权重,需要调整优先级队列的比较函数或采用其他策略。
阅读全文