首页 > 其他分享 >Floyd

Floyd

时间:2024-05-12 22:08:03浏览次数:11  
标签:infty 中心思想 全源 负环 枚举 Floyd 动态

为数不多的全源最短路算法,全源即,全部点为原点,即算出任意两个点之间的最短路径。
前提条件,没有负环。可有负权。
因为中心思想是动态规划,所以有很强的性质,做题的时候注意利用。

中心思想

中心思想为动态规划。
现在我们设 f[k][i][j] 表示从点 \(i\) 到点 \(j\),只经过 \(1\) 到 \(k\) 的最短距离。

初始化,当 \(k=0\) 时 f[0][i][j] 的值仅为 \(i\) 到 \(j\) 的边权,\(0\) 或者 \(+\infty\)。当 \(i = j\) 时为 \(0\),即到自身的距离为 \(0\);当 \(i\not=j\) 时,\(i\) 和 \(j\) 之间有权值则为权值,无权值则为 \(+\infty\)。
当 \(k\ge1\) 时,有 f[k][i][j] = min(f[k - 1][i][j], f[k - 1][i][k] + f[k - 1][k][j]) 即经过点 \(k\) 看是否能松弛 \(i\) 和 \(j\) 之间的距离。

时间复杂度也显而易见 \(O(n^3)\)

注意本质。

正确性

本质是动态规划,正确性显而易见,当 \(k=n\) 时,即可以经历所有点去松弛,自然可以得到最短路径,但是如果有负环,因为算法不能无限进行负环操作,因此,不能得出负无穷。

实际操作

  1. 初始化之后,从 \(1\) 到 \(n\) 枚举 \(k\) 的大小
  2. 枚举 \(i\) 点
  3. 枚举 \(j\) 点
  4. 根据转移方程,进行转移
  5. 重复上述操作

代码

很简单就三个 for

for (int i = 1; i <= n; i ++ )
	for (int j = 1; j <= n; j ++ )
		f[0][i][j] = g[i][j];

for (int k = 1; k <= n; k ++ )
	for (int i = 1; i <= n; i ++ )
		for (int j = 1; j <= n; j ++ )
			f[k][i][j] = max(f[k - 1][i][j], f[k - 1][i][k] + f[k - 1][k][j]);

因为是动态规划,转移又只涉及上一维,所以可以优化一维空间。
最常用的也是这种。

for (int k = 1; k <= n; k ++ )
	for (int i = 1; i <= n; i ++ )
		for (int j = 1; j <= n; j ++ )
			f[i][j] = max(f[i][j], f[i][k] + f[k][j]);

标签:infty,中心思想,全源,负环,枚举,Floyd,动态
From: https://www.cnblogs.com/blind5883/p/18188285

相关文章

  • Floyd算法
    Floyd首先,对该算法有一个大致的了解:通过动态规划的方式,按顺序对每两个点之间的最短距离进行处理而这个顺序用一句话总结就是:依次将每个点作为"中间点"做更新1、存储邻接矩阵存储用两个数组存储信息一个存储两点长度一个存储路径Path其中,D(-1)表......
  • Floyd算法
    多源最短路算法,可计算任意点对之间的最短路长度,时间复杂度\(O(n^3)\)Floyd算法思想十分简单,用\(d[i][j]\)表示\(i\)和\(j\)节点之间的最短路,其核心代码如下:\[d[i][j]=min(d[i][j],d[i][k]+d[k][j])\]遍历\(k\)、\(j\)、\(i\)更新即可。题目参考:洛谷:P6464题解:遍历传送门,然后更......
  • 最短路算法(Dijkstra + SPFA + Floyd)
    最短路算法(Dijkstra+SPFA+Floyd)Dijkstra算法1.算法基本介绍Dijkstra算法通常是求解单源最短路中最快的算法,但它无法处理存在负权边的情况(原因在正确性证明中)。Dijkstra本质上是一种贪心算法,通过不断调整每个点的“当前距离”最终得到最优结果,其实后面要讲到的几种算法也大......
  • floyd求路径
    #include<iostream>#include<stdio.h>#include<algorithm>#include<string>#include<cmath>#include<string.h>#defineR(x)x=read()#defineFor(i,j,n)for(inti=j;i<=n;++i)usingnamespacestd;inlin......
  • P8312 [COCI2021-2022#4] Autobus floyd最短路
    [P8312COCI2021-2022#4]Autobus-洛谷|计算机科学教育新生态(luogu.com.cn)思路:nnn数据范围很小可以用Floyd算法。注意:最多坐......
  • Floyd算法 【多源最短路】模板
    B3647【模板】Floyd-洛谷|计算机科学教育新生态(luogu.com.cn)#include<bits/stdc++.h>usingnamespacestd;constintN=1e2+10;constintinf=0x3f3f3f;intn,m;intg[N][N];voidfloyd(){for(intk=1;k<=n;k++){for(inti=1;i<=n;i++)......
  • Floyd&Dijkstra
    拓展,多条路径Floyd算法Floyd算法是一种求解“多源最短路”问题的算法在Floyd算法中,图一般用邻接矩阵存储,边权可正可负(但不允许负环),利用动态规划的思想,逐步求解出任意两点之间的最短距离我们需要准备的东西很少,只需要一个d数组:int[N][N][N],初始为无穷大,无穷大表示两点之间没......
  • Floyd 判圈算法
    概述  Floyd判圈算法又称作是龟兔赛跑算法,就是快慢指针的应用,主要用于判断并找到环形链表的入口。做法是设置两个指针,一个快指针(兔子),一个慢指针(乌龟),快指针一次移动两个节点,慢指针一次移动一个节点。如果有环存在,它们第一次会在环上相遇,这时快指针移动到出发点,转换成慢指针(就是......
  • lgB3647 Floyd最短路
    给出一张由n个点m条边组成的无向图,求所有点对(i,j)之间的最短路。n<=100;m<=4500;1<=w<=1000多源最短路模板题,注意循环顺序是kij,另外可能会有重边,因此两点之间的距离要初始化为inf,读入边权时取最小值。#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong......
  • Floyd算法学习笔记
    Floyd算法学习笔记前言如有错误,欢迎各位dalao批评指出。前置芝士:1.邻接矩阵(Floyd要用邻接矩阵存图)2.动态规划思想(最好学过,没学过也没有太大影响)1.Floyd所解决问题的类型我们可以发现,如Dijkstra,SPFA,BellmanFord一类的最短路算法都是解决单源点最短路问题,也就是确......