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要在最外层哦~~

相关推荐
All for pursuit.5 小时前
【链表-9】146.LRU缓存
数据结构·c++·算法·leetcode
木子算法5 小时前
测出来的值会抖:约束和目标带噪声时,「可行」和「更好」该怎么判
人工智能·算法·目标跟踪
hanlin036 小时前
刷题笔记:力扣第144题-二叉树的前序遍历
笔记·算法·leetcode
金士曼6 小时前
从规则到涌现:算法认知的三个层次
算法
AgentMaster7 小时前
数据资产化落地难题:5款数据中台系统架构对比与实施记录
大数据·人工智能·算法
鹿角片ljp7 小时前
从 Kimi Cyber Reasoning 学习网络安全推理数据集:从 Reasoning SFT 到安全 Agent 数据设计
数据结构·算法
residual_fan8 小时前
航空发动机故障诊断专用智能体(三):基于对比学习的时序特征区分方法
人工智能·算法·数据挖掘·数据分析
高亦真9 小时前
今天是学习嵌入式的第39天
linux·学习·算法
Omics Pro9 小时前
AI药物研发10原则!欧盟EMA×美国FDA
数据库·人工智能·算法·机器学习·自然语言处理
wabs6669 小时前
关于二叉树【力扣100.相同的树的思考】
数据结构·c++·算法·leetcode·二叉树·递归法