图论算法-Floyed求最短路径

在图论的世界里,最短路径问题一直是一个核心且引人入胜的研究领域。无论是交通路线规划、通信网络优化,还是物流配送路径选择,最短路径算法都发挥着关键作用。今天,我们就来深入探讨一种经典的求解所有顶点对之间最短路径的算法 ——Floyd 算法。

一、Floyd 算法原理

Floyd 算法基于动态规划的思想,通过一个状态转移方程来逐步更新图中任意两点之间的最短路径。其核心在于利用一个二维数组dist[i][j]来表示从顶点i到顶点j的最短距离。

初始化时,dist[i][j]表示图中直接相连的边的权重,如果i和j之间没有直接相连的边,则dist[i][j]设为无穷大。

然后,通过一个三层循环来不断更新dist[i][j]的值。最外层循环遍历所有的顶点k,中间层循环遍历所有的起始顶点i,最内层循环遍历所有的目标顶点j。在每次循环中,判断经过顶点k从i到j的路径是否比当前的dist[i][j]更短,如果是,则更新dist[i][j]的值。

状态转移方程为:dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j])

这个方程的含义是,从i到j的最短路径要么是当前已经记录的直接路径,要么是经过中间顶点k的路径。

二、代码实现(C++ 示例)

void floyed(){
	for(int k=1;k<=n;k++){
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
			}
		}
	}
}

这是核心算法,其中k在最外层作为中间站点一个一个遍历,类似dp问题,理解就是i到j的路径取i到j之间的长度和i到k加上k到j之间的长度最小值(k是中间站点)。

for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(i!=j)d[i][j]=INF;
			else d[i][j]=0;
		}
	}
for(int i=1;i<=m;i++){
		int x,y,z;
		cin>>x>>y>>z;
		d[x][y]=min(z,d[x][y]);
	}

        怕有些同学不会所以把读取操作代码页放进来了,其中n是点数,m是边数,INF是很大的数(无穷大级别,可以用1e9或以上),x和y是节点,z是边的权重(路径长度),d[i][j]是记录i到j的路径长度 。

        至于这么理解k是在最外层循环,可以参考一下这个例子:“这就好像你要规划旅游路线,你有一本旅游攻略,上面记录了各个景点之间的直接距离。你想找到任意两个景点之间的最短路线。你会先看看能不能通过某个特定的景点作为中转站来优化路线。你会按照一定的顺序,一个一个地尝试这些中转站,每次尝试完一个中转站,就更新一下所有景点对之间的最短路线。只有这样,你最后得到的路线才是最短的。 所以,把 k 放在最外层循环,就是为了按照顺序一个一个地尝试所有可能的中转站,保证我们能得到任意两个城市之间的最短路线。”

        精简一点就是能不能找到一个 “中转站” 城市 k,让从城市 i 到城市 j 的路线,经过这个中转站之后变得更短,能理解这个的话对这个算法就有很不错的认识了。

 

三、Floyd 算法的特点

  1. 简单直观:Floyd 算法的代码实现相对简洁,基于动态规划的思想易于理解和实现。
  1. 全局最优:它能够直接计算出图中所有顶点对之间的最短路径,而不仅仅是某一个源点到其他顶点的最短路径。
  1. 时间复杂度较高:Floyd 算法的时间复杂度为O(n^3),其中n是图中顶点的数量。这意味着当图的规模较大时,算法的运行效率会受到一定影响。

四、应用场景

  1. 交通网络规划:在城市交通网络中,帮助规划从任意一个地点到其他所有地点的最短路径,方便出行。
  1. 通信网络:确定数据包在网络中从源节点到目标节点的最短路径,优化路由选择。
  1. 物流配送:为配送车辆规划从仓库到各个客户点的最短路径,降低运输成本。

五、总结

Floyd 算法虽然存在时间复杂度较高的问题,但它在解决所有顶点对之间最短路径问题上的简单性和直接性使其在很多领域都有广泛的应用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值