最短路径的思想逻辑,基本概念,特点,适用场景,Dijkstra算法和Floyd-Warshall算法的算法思想,算法特点,图示及算法特性和c++代码实现
时间: 2024-08-26 14:00:28 浏览: 111
最短路径问题的基本概念是寻找两点之间的最小代价路径,常见于网络、地理路线规划等场景。其核心思想是通过贪心策略逐步逼近最优解。有几种常见的算法:
1. **迪杰斯特拉(Dijkstra)算法**:用于解决单源最短路径问题,特点是按距离顺序探索节点,每次都选择当前未访问节点中距离起点最近的一个。它假设所有边都是非负权重,适用于无权图或带权正边图。该算法维护一个优先队列,不断更新已知最短路径。图示上,从起点开始,每次扩展离起点最近的节点。
**C++代码实现(简化版)**:
```cpp
#include <queue>
void dijkstra(vector<vector<int>>& graph, int start, vector<int>& distances, vector<bool>& visited) {
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
pq.push({0, start});
distances[start] = 0;
while (!pq.empty()) {
int u = pq.top().second; pq.pop();
if (visited[u]) continue;
visited[u] = true;
for (int v : graph[u]) {
int alt = distances[u] + v;
if (alt < distances[v]) {
distances[v] = alt;
pq.push({alt, v});
}
}
}
}
```
2. **弗洛伊德-沃拉斯(Floyd-Warshall)算法**:可以求解任意两点之间的所有对最短路径,适用于有权图,包括负权重边。它通过动态规划的方式计算出每对顶点之间经过其他顶点的最短路径。图示上,每次迭代都会考虑一条边加入到之前的最短路径上是否能进一步优化。
**C++代码实现(简化版)**:
```cpp
void floydWarshall(vector<vector<int>>& graph) {
int n = graph.size();
for (int k = 0; k < n; ++k) {
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (graph[i][k] != INT_MAX && graph[k][j] != INT_MAX)
graph[i][j] = min(graph[i][j], graph[i][k] + graph[k][j]);
}
}
}
}
```
阅读全文