开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第19天,点击查看活动详情
7.1.4 多源最短路算法
方法1:直接将单源最短路算法调用|V|遍
对稀疏图效果好
方法2:Floyd算法
对稠密图效果好
Floyd算法
-
只经过一部分顶点,只经过编号小于等于k的那些顶点
-
最初的D负一次方是定义为连接矩阵
-
-
如果i和j之间没有直接的边,D[i] [j]应该定义为:正无穷(不是0也不是负无穷)
-
- 这个说人话就是加入k如果导致i到j的最短路径发生了变化(其实就是这个k的加入导致更短的啦),那么i到k和k到j必定是两段最短的路径
多源最短路算法
void Floyd()
{
for( i = 0; i < N ; i++ )
for( j = 0; j < N ; j++ ){
D[i][j] = G[i][j];
//path[i][j] = -1;这个二维数组是用来记录路径的,方便求最短路径,初始化为-1表示ij之间现在是没有路径的
}
for( k = 0; k < N ; k++ )
for( i = 0; i < N ; i++ )
for( j = 0; j < N ; j++ )
if( D[i][k] + D[k][j] < D[i][j] ){
D[i][j] = D[i][k] + D[k][j];
//如果我们不仅要ij之间的最短距离,还要求输出他们两个之间的那个最短路径
//path[i][j] = k;当路径被更新之后,就意味着i到j就会经过k,我们就把k记在passi和j这个元素里
//这样记录的优势:很容易的把i到j之间的最短路径也打印出来,采用递归打印(i到k的路径,然后把k打出来,最后在递归的打印k到j的那段路径)出来
//i到j的最短路径:i到k的最短路径 + k + k到j的最短路径,三段组成
}
}
//三重算法可以简单得到ford算法的时间 T = O(|V|³)