多源最短路(floyd算法)

本文深入讲解Floyd算法,一种用于解决图中任意两点间最短路径问题的有效算法。适合于稠密图,能够处理带有负权重边的图,但不能有负环。文章通过动态规划思想,详细解释了算法原理及其实现过程。

Floyd算法:

  如何简单方便的求出图中任意两点的最短路径

  Floyd-Warshall算法(O(n^{3})比较适用于边较多的稠密图(Dense Graph))

  Floyd算法用来找出每对顶点之间的最短距离,它对图的要求是,既可以是无向图也可以是有向图,边权可以为负,但是不能存在负环(可根据最小环的正负来判定).

思想:

  Floyd算法基于动态规划的思想,以 u 到 v 的最短路径至少经过前 k 个点为转移状态进行计算,通过 k 的增加达到寻找最短路径的目的.当 k 增加 1 时,最短路径要么不边,如果改变,必经过第 k 各点,也就是说当起点 u 到第 k 个点的最短距离加上第 k 个点到终点 v 的最短路径小于不经过第 k 个节点的最优最短路经长度的时候更新 u 到 v 的最短距离. 当 k = n 时, u 到 v 的最短路径就确定了. 

代码:

int n,m,d[100][100];//点数,边数,邻接矩阵
scanf("%d%d",&n,&m);

memset(d,INF,sizeof(d));//初始化邻接矩阵
for(int i=1;i<=n;i++){
    d[i][i]=0;
}
for(int i=1;i<=m;i++){
    scanf("%d%d%d",&a,&b,&c);//边的信息
    d[a][b]=c;
    //d[b][a]=c 无向图调用
}

for(int k=1;k<=n;k++){
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(d[i][k]<INF&&d[k][j]<INF){  //判断是否能从松弛点到达
                d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
            }
        }
    }
}
 

 

转载于:https://www.cnblogs.com/wz-archer/p/10003144.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值