【图论】Floyd算法(求2点间最短路径)

本文介绍了Floyd算法在求解图中两点间最短路径的应用,通过一道HDU1874题目进行实例解析。代码实现中强调了算法的时间复杂度为O(n^3),在某些情况下可能会导致TLE,因此建议在效率要求较高的场景下使用Dijkstra算法。Floyd算法的核心在于利用动态规划的思想,通过dp[s][t]=min(dp[s][t],dp[s][k]+dp[k][t])的状态转移方程找到最短路径。" 127977389,14299665,Java继承概念与实战,"['Java开发', '面向对象', '编程基础']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
来道例题吧:hdu1874
在这里插入图片描述
AC代码如下(复杂度为O(n^3),小心TLE,优选Dijkstra算法):
记住!!K一定要放在最外层!!

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f

const int maxn=205;
int n,m;
int mp[maxn][maxn];

int main(){
	while(cin>>n>>m){
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				if(i==j) mp[i][j]=0;
				else mp[i][j]=INF;
			}
		}

		for(int i=1;i<=m;i++){
			int x,y,z;cin>>x>>y>>z;
			mp[x][y]=min(z,mp[x][y]);
			mp[y][x]=min(z,mp[y][x]);
		}
		
		int s,t;cin>>s>>t;
		//Floyd的写法:
		for(int k=0;k<n;k++){
			for(int i=0;i<n;i++){
				for(int j=0;j<n;j++){
					mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);
				}
			}
		}
		//止
		if(mp[s][t]==INF) cout<<"-1"<<endl;
		else cout<<mp[s][t]<<endl;
	}
}

这里我解释一下Floyd算法,他是求两个点最短路径的,这里运用了dp的思维。
设起点为s,终点为t,路过的一个点(即搭桥点为k)
核心关键就是dp[s][t]=min(dp[s][t],dp[s][k]+dp[k][t])
这就是状态转移,最后存最小即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值