数据结构第七周笔记(6)——图(中)(慕课浙大版本--XiaoYu)

204 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第19天,点击查看活动详情

7.1.4 多源最短路算法

方法1:直接将单源最短路算法调用|V|遍

  1. image-20220802162534649对稀疏图效果好

方法2:Floyd算法

  1. image-20220802162637428对稠密图效果好

Floyd算法

  1. 只经过一部分顶点,只经过编号小于等于k的那些顶点

  2. image-20220802163030611最初的D负一次方是定义为连接矩阵

  3. image-20220802163007951

  4. 如果i和j之间没有直接的边,D[i] [j]应该定义为:正无穷(不是0也不是负无穷)

  5. image-20220802163903479

    1. 这个说人话就是加入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|³)