首页 > 编程语言 >多源最短路算法——Floyd算法(转载)

多源最短路算法——Floyd算法(转载)

时间:2023-03-14 20:22:36浏览次数:63  
标签:int 短路 算法 Floyd 多源 dp

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

2.Floyd简介:

 

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

 1 int g[N][N];  // 邻接矩阵存图
 2 int dp[N][N][N];
 3 void floyd(int n) {
 4     for (int k = 0; k <= n; ++k) {
 5         for (int i = 1; i <= n; ++i) {
 6             for (int j = 1; j <= n; ++j) {
 7                 if (k == 0) {
 8                     dp[k][i][j] = g[i][j];
 9                 } else {
10                     dp[k][i][j] = min(dp[k - 1][i][j], dp[k - 1][i][k] + dp[k - 1][k][j]);
11                 }
12             }
13         }
14     }    
15 }

这样太浪费空间了把。

4.Floyd空间优化:

 

 

 

怎么确定状态转移的?
看下图

 

 

我们发现从顶点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

 1 int g[N][N];
 2 void floyd(int n) {
 3     for (int k = 1; k <= n; ++k) {
 4         for (int i = 1; i <= n; ++i) {
 5             for (int j = 1; j <= n; ++j) {
 6                 g[i][j] = min(g[i][j], g[i][k] + g[k][j]);
 7             }
 8         }
 9     }    
10 }

 

 转载自:https://blog.csdn.net/lytwy123/article/details/90214622

标签:int,短路,算法,Floyd,多源,dp
From: https://www.cnblogs.com/jyssh/p/17216196.html

相关文章

  • Qt 算法->程序运行时间(计时函数)
    参考:Qt算法->程序运行时间(计时函数)_qtclock函数_男银的骄傲的博客-CSDN博客 用的这个博客里的方法 QT笔记(7)——Qt利用QTime计算程序运行时间_abcvincent的博客-CSDN......
  • 【排序算法】希尔排序
    1 前言今天把排序的几个算法过一下,这节我们看一下希尔排序,简单的来说就是多次插入排序,我们看示例。2 代码示例/***希尔排序,也就是多次插入排序*可以参考插入......
  • 【排序算法】插入排序
    1 前言今天把排序的几个算法过一下,这节我们看一下插入排序,简单的来说就是从第2个元素往前寻找位置进行插入,我们看示例。2 代码示例/***插入排序*从第2个元素......
  • 【排序算法】直接选择排序
    1 前言今天把排序的几个算法过一下,这节我们看一下直接选择排序,简单的来说就是默认某个位置为最小然后从位置后的元素逐个比较进行交换,我们看示例。2 代码示例/**......
  • 算法-练习2
    题1给你两个 非空的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表......
  • 笔试算法《字符串排序_1》
    题目描述编写一个程序,将输入字符串中的字符按如下规则排序。规则1:英文字母从A到Z排列,不区分大小写。如,输入:Type输出:epTy规则2:同一个英文字母的大小写同时存在时,......
  • [思维提升|干货All in]6种算法解决LeetCode困难题:滑动窗口最大值
    为了更好的阅读体验,欢迎阅读原文:[思维提升|干货Allin]6种算法解决LeetCode困难题:滑动窗口最大值(eriktse.com)最近在leetcode遇到一道非常经典的题目:239.滑动窗口最......
  • Tarjan算法详解
    Tarjan算法介绍TarjanTarjan算法是用于在有向图中求强连通分量的算法这里给出强连通分量的定义:有向图中一个最大的图,使这个图中每个两点都能够互相到达。这个最大的图称......
  • 决策树算法
    fromsklearnimporttreefromsklearn.datasetsimportload_irisfromsklearn.model_selectionimporttrain_test_splitimportnumpyasnpif__name__=="__main__":......
  • k近邻算法
    如果一个样本在特征空间中的k个最“相似”(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别相似度:即两个点的距离来衡量距离越近越近相似度......