笔记:弗洛伊德算法(解决图中任意两顶点的最短路径和最小权值问题)

本文深入探讨了弗洛伊德算法在解决有权图中任意两点间最小路径问题的应用。通过详细解释算法处理过程,包括如何利用邻接矩阵计算顶点间的最小权值和最短路径,展示了算法的具体实现步骤及时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//一个有权图的邻接矩阵经过弗洛伊德算法处理后,得到的结果,能够解决求任意两顶点的最小路径问题和最小
//权值问题。具体处理得到的结果是一个记录最小权值的二维数组A[i][j](表示顶点i到顶点j的最小权值)
//和记录前驱顶点的二维数组Path[i][j](表示i到j的最短路径中j的前驱结点,如是k,则再查
//Path[i][k],如此可逆序输出i到j的最短路径);具体处理步骤看代码
void Floyd(MGraph G,int Path[][]){
    int i,j,k;
    int A[MaxSize][MaxSize];
    for(i=0;i<G.vexnums;i++){//对数组A[i][j]和Path[i][j]进行初始化
        for(j=0;j<G.vexnums;j++){
            A[i][j]=G.Edges[i][j];
            Path[i][j]=-1;//若处理后仍为-1,则表示i到j直达即为最短路径
        }
    }
    for(k=0;k<G.vexnums;k++){//该循环为比较i到j的路径是否比i到k再到j的路径要长,如果是,则更
//新为较小值,并且记录k表示路径经过顶点k,*但最后结果不一定经过顶点k,这只是目前遍历中的最优解,
//比如,2->0->1比2->1权值小,但比2->3->1权值大,由于遍历时先遍历的k0,所以此时的k0不在2->1
//的最终优解中,这也是这个循环不会因为遍历的顺序而错过最优解的关键*
        for(i=0;i<G.vexnums;i++){
            for(j=0;j<G.vexnums;j++){
                if(A[i][j]>A[i][k]+A[k][j])[
                    A[i][j]=A[i][k]+A[k][j];
                    Path[i][j]=k;
                }
            }
        }
    }
}

时间复杂度为O(n^3)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值