最短路问题
在图论里,从一个点到达另一个点的最短距离
分为单源最短路和多源最短路
求最短路的4个算法
算法 | 时间复杂度 | 类型 | 备注 |
---|---|---|---|
Floyd算法 | O((n^3)) | 多源最短路 | 可以判断负圈 |
Dijkstra算法 | O((n^2)) | 单源最短路 | 可以堆优化或优先队列优化 |
Bellman-Ford算法 | O((n*m)) | 单源最短路 | |
Spfa算法 | 单源最短路 | Bellman-Ford算法的优化 |
优化算法
Dijkstra的队列优化
而最短路问题又有很多种,比如
- 最小环
- 哈密顿回路
- 最小生成树
弗洛伊德算法Floyd
https://blog.csdn.net/Harington/article/details/81982299
定义g[i][j]表示i到j的最短路径,k是中介,i通过k到达j,指的是,只允许经过第k个结点
for(int k = 1; k <= n; k++){//中转点
for(int i = 1; i <= n; i++){//起点
for(int j = 1; j <= n; j++){//终点
if(i == j || i == k || j == k) continue;
if(dis[i][j] > dis[i][k] + dis[k][j]){
dis[i][j] = dis[i][k] + dis[k][j];
}
}
}
}
时间复杂度是O(n^3),对于大数据不合适,适合与n在100以内的数据