ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

多源最短路算法——Floyd算法

2019-05-14 20:48:57  阅读:326  来源: 互联网

标签:int 短路 V1 算法 Floyd V4 多源 dp


1.多源最短路简介:

我们知道单源最短路是指从某一个源点到图中的其它顶点的最短路。
多源最短路就是指每一个点到图中其他顶点的最短路。
那么有的人肯定想我知道求单源最短路的算法了,那么有多少个点我就求多少次呗,这样做时间效率不高,空间效率也极其低。
那么有什么算法求解多源最短路呢?——Floyd

2.Floyd简介:

Floyd简介1.png

3.三维空间Floyd核心代码:

int g[N][N];  // 邻接矩阵存图
int dp[N][N][N];
void floyd(int n) {
    for (int k = 0; k <= n; ++k) {
        for (int i = 1; i <= n; ++i) {
            for (int j = 1; j <= n; ++j) {
                if (k == 0) {
                    dp[k][i][j] = g[i][j];
                } else {
                    dp[k][i][j] = min(dp[k - 1][i][j], dp[k - 1][i][k] + dp[k - 1][k][j]);
                }
            }
        }
    }    
}

这样太浪费空间了把。

4.Floyd空间优化:

Floyd优化.png
怎么确定状态转移的?
看下图
Floyd算法流程.png
我们发现从顶点1到顶点4有三条路径
dp[0][1][4]就相当于图中的g[1][4]这里采用邻接矩阵的形式
然后k作为中介点可以使2,3
那么dp[2][1][4] = dp[2][1][2] + dp[2][2][4]
也就是我们可以简化为dp[1][4] = dp[1][2] + dp[2][4]
V1到V4等于V1到V2加上V2到V4,可以理解吧。
然后V1到V4还可以等于V1到V3加上V3到V4
即最后的最短路就是dp[1][4] = min(g[1][4], min(g[1][2] + g[2][4]
, g[1][3] + g[3][4]))

优化空间后的Code

int g[N][N];
void floyd(int n) {
    for (int k = 1; k <= n; ++k) {
        for (int i = 1; i <= n; ++i) {
            for (int j = 1; j <= n; ++j) {
                g[i][j] = min(g[i][j], g[i][k] + g[k][j]);
            }
        }
    }    
}

标签:int,短路,V1,算法,Floyd,V4,多源,dp
来源: https://blog.csdn.net/lytwy123/article/details/90214622

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有