Floyd——Warshall

Floyd------Warshall

多源最短路径:一次性可以算出任意两点之间最短距离

相比较之前的Dijkstra,这个可以算负边权(但是注意不要有负环),当然鱼和熊掌不可兼得,随着三重循环的展开,空间复杂度自然有点复杂,效率相比较Dijkstra来说就比较低了。

这里我们想要求a到b的距离最短,要么是a直接到b,要么a,b之间还有一个k,从a到k再到b,从而判断那个最短我们就选哪个。如上图,4和3之间的距离原本是12,那如果我们通过1来当过客的话,我们通过1,路程进一步缩短为5+6=11。在如果我们把2也拉入过客我们通过1,2,路程进一步缩短为5+2+3=10,那么10就是我们4到3的最短路径了。

下面我们来模拟一下方便理解:

1 2 3 4
1 0 2 6 5
2 ∞\infty∞ 0 3 ∞\infty∞
3 7 ∞\infty∞ 0 1
4 5 ∞\infty∞ 12 0

我们先允许1号经过:

dis3 1+dis1 2=9<∞\infty∞,dis4 1+dis1 \[\]=7<∞\infty∞,dis4 1+dis1 3=11<12,

1 2 3 4
1 0 2 6 5
2 ∞\infty∞ 0 3 ∞\infty∞
3 7 9 0 1
4 5 7 11 0

接下来我们允许2号也经过:

dis1 2+dis2 3=5<6,dis4 2+dis2 3=10<11,

1 2 3 4
1 0 2 5 5
2 ∞\infty∞ 0 3 ∞\infty∞
3 7 9 0 1
4 5 7 10 0

然后以此类推······我们就得到了

复制代码
#include<bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
const int N=105,INF=0x3f3f3f3f;
int dis[N][N];
int n,m;
signed main()
{
	cin>>n>>m;
	memset(dis,0x3f,sizeof(dis));
	for(int i=1;i<=n;i++)
	dis[i][i]=0;
	for(int i=0;i<m;i++)
	{
		int a,b,w;
		cin>>a>>b>>w;
		dis[a][b]=min(dis[a][b],w);
		dis[b][a]=min(dis[b][a],w);
	}
		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]);
	for(int i=1;i<=n;i++)
	{
		if(dis[1][i]==INF) cout<<"-1"<<" ";
		else cout<<dis[1][i]<<" ";
	}
	return 0;
}

最后要注意的是k要在最外层哦~~

相关推荐
牧瀬クリスだ1 天前
Redis Hash实战:高效存储对象与购物车
java·数据库·redis·算法·哈希算法
木井巳1 天前
【动态规划: 路径问题】下降路径最小和
java·算法·leetcode·动态规划·推荐算法
deepseek231 天前
OpenAI三项科学发现拆解:3-SAT亚指数算法挑战ETH,AI科学声明的验证流水线怎么搭
人工智能·算法·openai
梦帮科技1 天前
基于幺正李代数连续归一化流的混合量子生成模型 (HQNN-Flow) 完整技术指南(上部分)
网络·人工智能·算法·量子计算
青少儿编程课堂1 天前
蓝桥杯青少组 + 全国青少年信息素养大赛 + 电子学会图形化考级|校园推箱子大挑战解析
c++·python·算法·bfs·信息学竞赛
荆棘鸟智能1 天前
河道采砂船识别与轨迹追踪怎么做?检测、跟踪与电子围栏实战思路
人工智能·算法·目标检测
DFT计算杂谈1 天前
GSAS-II X 射线衍射(XRD)数据转换为对分布函数(PDF,Pair Distribution Function)
算法·机器学习·pdf
绕灵儿1 天前
火灾检测-应用场景-YOLO训练记录
人工智能·算法
YLCHUP1 天前
【模拟&STL】题解:AT_abc203_e [ABC203E] White Pawn_基础算法_数据结构_STL模板库_AtcoderABC_C++算法竞赛
数据结构·c++·算法·leetcode·动态规划·哈希算法·近邻算法
(●—●)橘子……1 天前
力扣 第525场周赛 练习理解
数据结构·python·学习·算法·leetcode