我们作为刚学图论的小蒟蒻,先接触到的算法一定是图上最短路径算法。而最短路算法中最简单的当属Floyd-Warshall算法。下面是一些基本介绍:

​该算法可以计算图上任意两点间的最短路径

时间复杂度:​​​​O(n^3)

适用情况:适用出现负边权的情况

算法伪代码:

弗洛伊德算法的基本思想是动态规划,我们枚举每一个点,并以其为中间节点更新任意两点间的最小距离,伪代码:

#define maxn 最大节点数
#define inf 0x7fffffff-2
long long val[maxn][maxn];
long long dis[maxn][maxn];
inline void floyd(){
for(int i=1;i<=maxn;i++)
for(int j=1;j<=maxn;j++)
if(val[i][j])
dis[i][j]=val[i][j];
else
dis[i][j]=inf;
for(int k=1;k<=maxn;k++)
for(int i=1;i<=maxn;i++)
for(int j=1;j<=maxn;j++)
if(dis[i][j]>dis[i][k]+dis[k][j])
dis[i][j]=dis[i][k]+dis[k][j];
}

​此时,dis[i][j]就是从i节点到j节点的最短路径。

算法分析&&思路讲解

  1. 初始化:我们在初始化时,将有边相连的节点间distance更新为边权值,无边相连直接设为极大值。
  2. 动态规划:对于每个节点,我们都让它做一次中间节点(k),然后分别枚举另外两个节点(i,j),如果当前从i到j的最短路大于从i到k的最短路加上从j到k的最短路,即从i到j如果经过k点会路径更短,那么我们更新从i到j的最短路。
  3. 算法结束,我们得到了所有的最短路。

需要强调的一点是,floyd中k的循环必须写在最外层,否则会导致动态规划状态转移发生错误!

例题讲解:Luogu P2935

传送门

不难发现,题目是让我们求所有牧场到喜欢的牧场的最短路,这就是所谓的多源最短路问题。对于这道题思路如下:

  1. 用floyd求出所有最短路。
  2. 枚举每个点,求出最小平均距离。

该题数据较小,这种思路完全可以通过。

代码:

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3fffffff
int n,m,f,u,v,t;
int square[501][501];
long long dis[501][501];
int like[501];
int main(){
scanf("%d %d %d",&n,&f,&m);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
dis[i][j]=inf;
}
dis[i][i]=0;
}//预处理。
for(int i=1;i<=f;i++){
scanf("%d",&like[i]);
}//输入每个喜欢的牧场
for(int i=1;i<=m;i++){
scanf("%d %d %d",&u,&v,&t);
dis[u][v]=t;
dis[v][u]=t;
}//输入牧场距离并预处理
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);//裸的floyd板子
}
}
}
int ans,maxx=inf,sum=0;
for(int i=1;i<=n;i++){
sum=0;
for(int j=1;j<=f;j++){
sum+=dis[i][like[j]];//统计从该节点到所有喜欢的牧场的总最短距离
}
if(sum<maxx){
ans=i;
maxx=sum;
}
//这里注意一下,题目说让我们求的是平均距离最小,但其实喜欢的牧场个数固定,我们就只需要求总最短路径最小就行了,不用再取平均值。
}
cout<<ans;//输出牧场序号
return 0;
}

拓展延伸:算法变形

floyd算法在一些情况下可以变形,用途是判断图上任意两点间连通性。

伪代码:

#define maxn 最大节点数
bool val[maxn][maxn];
bool dis[maxn][maxn];
inline void floyd(){
for(int i=1;i<=maxn;i++)
for(int j=1;j<=maxn;j++)
if(val[i][j])
dis[i][j]=1;//相邻两点间距离设为ture
else
dis[i][j]=0;//不相邻设为false
for(int k=1;k<=maxn;k++)
for(int i=1;i<=maxn;i++)
for(int j=1;j<=maxn;j++)
dis[i][j]=dis[i][j]||(dis[i][k]&&dis[k][j]);
//原理:若i与k联通,k与j联通,则i与j联通
}

完结撒花

算法之Floyd-Warshall算法【c++】【图论】【最短路】的更多相关文章

  1. Floyd—Warshall算法

    我们用DP来求解任意两点间的最短路问题 首先定义状态:d[k][i][k]表示使用顶点1~k,i,j的情况下,i到j的最短路径 (d[0][i][j]表示只使用i和j,因此d[0][i][j] = c ...

  2. 图论之最短路径(1)——Floyd Warshall & Dijkstra算法

    开始图论学习的第二部分:最短路径. 由于知识储备还不充足,暂时不使用邻接表的方法来计算. 最短路径主要分为两部分:多源最短路径和单源最短路径问题 多源最短路径: 介绍最简单的Floyd Warshal ...

  3. 图论——最短路径 Dijkstra算法、Floyd算法

    1.弗洛伊德算法(Floyd) 弗洛伊算法核心就是三重循环,M [ j ] [ k ] 表示从 j 到 k 的路径,而 i 表示当前 j 到 k 可以借助的点:红色部分表示,如果 j 到 i ,i 到 ...

  4. 图论算法(二)最短路算法:Floyd算法!

    最短路算法(一) 最短路算法有三种形态:Floyd算法,Shortset Path Fast Algorithm(SPFA)算法,Dijkstra算法. 我个人打算分三次把这三个算法介绍完. (毕竟写 ...

  5. WarShall算法

    1.引言 图的连通性问题是图论研究的重要问题之一,在实际中有着广泛的应用.例如在通信网络的联通问题中,运输路线的规划问题等等都涉及图的连通性.因此传递闭包的计算需要一个高效率的算法,一个著名的算法就是 ...

  6. Gym 101873D - Pants On Fire - [warshall算法求传递闭包]

    题目链接:http://codeforces.com/gym/101873/problem/D 题意: 给出 $n$ 个事实,表述为 "XXX are worse than YYY" ...

  7. 最小生成树(prime算法 & kruskal算法)和 最短路径算法(floyd算法 & dijkstra算法)

    一.主要内容: 介绍图论中两大经典问题:最小生成树问题以及最短路径问题,以及给出解决每个问题的两种不同算法. 其中最小生成树问题可参考以下题目: 题目1012:畅通工程 http://ac.jobdu ...

  8. Floyd最短路径算法(来自微信公众号“算法爱好者”改编)

    暑假,小哼准备去一些城市旅游.有些城市之间有公路,有些城市之间则没有,如下图.为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程. 上图中有4个城市8条公路,公路上的数字表 ...

  9. Floyd最短路径算法

    看完这篇文章写的小程序,Floyd最短路径算法,求从一个点到另一个点的最短距离,中间可以经过其他任意个点.三个for循环,从i到j依次经过k的最短距离,最外层for循环是经过点K,内部两个循环是从i( ...

  10. C++编程练习(11)----“图的最短路径问题“(Dijkstra算法、Floyd算法)

    1.Dijkstra算法 求一个顶点到其它所有顶点的最短路径,是一种按路径长度递增的次序产生最短路径的算法. 算法思想: 按路径长度递增次序产生算法: 把顶点集合V分成两组: (1)S:已求出的顶点的 ...

随机推荐

  1. win10桌面右键卡顿卡死解决方法

    win+R,打开命令行 输入services.msc 找到NADIA Display Container LS,将其由自动改为禁用,解决问题. PS:网上有些改注册表的方法,确实可以治标,但是大家都应 ...

  2. 3.httprunner-extract/.env/Testcase

    参数关联-extract 场景:上一个接口的返回值,传给下一个接口当请求参数 extract:提取变量 $变量名 :引用变量 假设我们有如下场景 用户A登录之后,返回值返回用户UID,我们需要查询该用 ...

  3. 嵌入式-c语言基础:冒泡排序实现从大到小排列

    #include<stdio.h> int main() { /*冒泡排序:从大到小*/ /*i=0 第1轮(i+1):需要比较9次(sizeArr-i-1)*/ /*i=1 第2轮(i+ ...

  4. hwlog--logger.go

    // Copyright(C) 2021. Huawei Technologies Co.,Ltd. All rights reserved.// Package hwlog provides the ...

  5. Go语言核心36讲21

    提到Go语言中的错误处理,我们其实已经在前面接触过几次了. 比如,我们声明过error类型的变量err,也调用过errors包中的New函数.今天,我会用这篇文章为你梳理Go语言错误处理的相关知识,同 ...

  6. Mybatis下的SQL注入漏洞原理及防护方法

    目录 一.前言 二.SQL 注入漏洞原理 1.概述 2.漏洞复现 3.修复建议 三.Mybatis 框架简介 1.参数符号的两种方式 2.漏洞复现 四.Mybatis 框架下的 SQL 注入问题及防护 ...

  7. 前端项目通过‘URL 重写’部署在 IIS 中,访问 WebAPI 接口

    〇.前言 在前端项目开发时,我们可以通过配置代理 proxy 来访问本地或者是远程接口,但是部署后代理就失效了.如果项目部署在 IIS 上,就没法去对应到指定接口,此时就需要 IIS 中的'URL重写 ...

  8. 初次邂逅 EasyExcel

    前言 由于工作原因,有这种需求,就是把数据库中的数据导出成 Excel 表格,同时,也得支持人家用 Excel 表格导入数据到数据库.当前项目也是在用 EasyExcel,所以我不得不学啦! 以前学习 ...

  9. bug处理记录:java.util.UnknownFormatConversionException: Conversion = 'Y'

    1. 报错: java.util.UnknownFormatConversionException: Conversion = 'Y' at java.util.Formatter$FormatSpe ...

  10. Vue3 企业级优雅实战 - 组件库框架 - 8 搭建组件库 cli

    前面的文章分享了组件库的开发.example.组件库文档,本文分享组件库 cli 开发. 1 为什么要开发组件库 cli 回顾一个新组件的完整开发步骤: 1 在 packages 目录下创建组件目录 ...