贪心算法求最短路径C++
时间: 2024-12-20 07:25:14 浏览: 6
贪心算法通常用于求解最优解问题,在最短路径问题中,如Dijkstra算法和Floyd-Warshall算法,并不适合直接求解所有图的最短路径,因为它们不是总是能找到全局最优解。但对于一些特定的情况,比如寻找单源最短路径,可以采用贪心策略。
Dijkstra算法是一个经典的贪心算法,适合于带权重的有向无环图(DAG)或无权图。C++实现时,一般会维护一个优先队列(可以用`std::priority_queue`),从起点开始,每次选取距离起点最近的未访问节点,然后更新其相邻节点的距离。这个过程不断迭代直到所有节点都被访问过,得到的就是起点到其他所有节点的最短路径。
以下是Dijkstra算法的一个简单C++版本:
```cpp
#include <vector>
#include <queue>
#include <limits>
struct Edge {
int destination;
int weight;
};
class Graph {
private:
std::vector<std::vector<Edge>> adjList; //邻接列表表示
public:
void dijkstra(int start) {
std::priority_queue<std::pair<int, int>, std::vector<std::pair<int, int>>, std::greater<int>> pq;
std::vector<int> distances(adjList.size(), std::numeric_limits<int>::max());
distances[start] = 0;
pq.push({0, start});
while (!pq.empty()) {
int u = pq.top().second;
pq.pop();
for (const auto &edge : adjList[u]) {
int v = edge.destination;
int newDistance = distances[u] + edge.weight;
if (newDistance < distances[v]) {
distances[v] = newDistance;
pq.push({newDistance, v});
}
}
}
// 返回distances数组,包含了每个节点到起点的最短距离
}
};
阅读全文