mirror of
https://github.com/ShusenTang/LeetCode.git
synced 2024-09-02 14:20:01 +00:00
62 lines
1.7 KiB
Markdown
62 lines
1.7 KiB
Markdown
# 最短路径问题
|
|
|
|
## 1. Dijkstra算法
|
|
## 1.1 算法描述
|
|
TODO
|
|
|
|
## 1.2 代码
|
|
``` C++
|
|
const int INF = 0x7FFFFFFF;
|
|
void Dijkstra(vector<vector<int> >&G, int s, vector<int>&dist, vector<int>&prev){
|
|
/*
|
|
Dijkstra算法求单源最短路径. (与Prim算法很相似, 注意对比)
|
|
|
|
参数:
|
|
G : 有向图的邻接矩阵, 注意不能有负边, 权值为0x7FFFFFFF代表无边
|
|
s : 源点编号
|
|
dist: 存放各个结点到源点的最短路径长度
|
|
prev: 存放各个结点到源点的最短路径上的前驱结点
|
|
|
|
时间复杂度O(v^2)
|
|
*/
|
|
int n = G.size(); // 顶点数
|
|
|
|
for(int i = 0; i < n; i++){
|
|
dist[i] = G[s][i];
|
|
prev[i] = -1;
|
|
}
|
|
dist[s] = 0; // 源点到自己最短距离为0
|
|
vector<int>processd(n, 0); // 是否已经被处理(即是否已求得最短路径)
|
|
processd[s] = 1;
|
|
|
|
// 不断加入剩下的 n-1 个结点到已被处理结点集合中
|
|
for(int i = 1; i < n; i++){ // 循环 n-1 次
|
|
int mindist = INF, v = -1;
|
|
for(int j = 0; j < n; j++){
|
|
if(!processd[j] && mindist > dist[j]){
|
|
mindist = dist[j];
|
|
v = j;
|
|
}
|
|
}
|
|
if(v == -1){
|
|
// cout << "Warning: 存在源点不可达的结点, 提前结束!" << endl;
|
|
return;
|
|
}
|
|
|
|
// 将结点v加入到已处理集合中
|
|
processd[v] = 1;
|
|
|
|
// 更新剩余结点到已处理结点集合的最短距离
|
|
for(int j = 0; j < n; j++)
|
|
if(!processd[j] && G[v][j] < INF && dist[j] - dist[v] > G[v][j]){
|
|
dist[j] = dist[v] + G[v][j];
|
|
prev[j] = v;
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
## 2. Bellman-Ford算法
|
|
TODO
|
|
|
|
## 3. Floyd算法 |