最短路
给出有向图(或无向图)各边的长度
- 求任意两点间的最短路径长度
- 给出源点s,终点t可变
Floyd算法
问题一,有多个源点,采用Floyd算法
设定:有n个顶点,a[i][j]为顶点i到j的的距离,算法的核心操作为:
1 | for (int i = 1; i <= n; i++) a[i][i] = 0; |
这个代码十分简单粗暴, 其中if那两句的操作叫松弛, 也是贯穿最短路算法的核心思想
如果a到b可以通过中转站来缩短距离,那就更新这个距离
Floyd算法就是通过对所有边都检查一遍来实现的,复杂度为O($n^3$),好处就是任意两点的最短路都可以知道
Dijkstral算法
问题二,只有一个源点,采用Dijkstral算法
算法的思想是,每次从源点找一条最短的边,然后用这条边来更新源点到其他顶点的距离,然后将这条边拉黑
n个顶点的话最多只需要n-1次操作就可以了,n-1次选边,最多n-2次松弛,时间复杂度为O($n^2$)
1 | int dist[maxn], a[maxn][maxn], vis[maxn], n, m, st, en; |
以上为Dijkstral的核心代码, 源点st到任意顶点的最短距离都可以知道