多源最短路
相比较与单源最短路问题,多源最短路问题简单了很多。
多源最短路只有一个 Floyd 算法。
Floyd 算法其实是使用动态规划的思想实现的,核心是三重循环。
设定
n n n 表示图中顶点
数据定义
const LL INF=0x3f3f3f3f3f3f3f3f;
//d[i][j] 表示从顶点i到顶点j的最短路径
//初始值d,就是邻接矩阵中所有值的边
LL d[N][N];
初始化d
for (LL i=1; i<=n; i++) {
for (LL j=1; j<=n; j++) {
if (i==j) {
d[i][j]=0;
} else {
d[i][j]=INF;
}
}
}
核心代码
void floyd() {
for (LL k=1; k<=n; k++) {
for (LL i=1; i<=n; i++) {
for (LL j=1; j<=n; j++) {
//从顶点i到顶点j,中途经过顶点k
d[i][j]=min(d[i][j], d[i][k]+d[k][j];
}
}
}
}
注意事项
- Floyd 算法可以处理负权,但是不能处理有负权回路环。
- 由于使用 INF 来初始化 d d d,而且图中可能出现负权边。我们需要使用 > = I N F / 2 >= INF/2 >=INF/2 来判断无通路。
时间复杂度
O ( n 3 ) O(n^3) O(n3)。
模板题
http://47.110.135.197/problem.php?id=6392。