最短路——Floyd算法

笔者要为没有学好的离散买单,所以笔者这次学的算法跟离散有关,其实只是矩阵而已。

离散教材上面有对最短路问题的一些叙述:“任给一个简单带权图G=<V,E,W>u,vV,求u,v之间的最短路径及距离。”但是因为教材上面给的Dijkstra算法笔者还没有完全弄清楚,在百度之后发现还有其他三种求最短路的算法,分别是Floyd算法,Bellman算法,spfa算法;今天笔者将记录较为简单的Floyd算法。

Floyd算法最显著的特点就是核心算法语句很短只有5行,但是时间复杂度稍微大了一点,是O(Nⁱ)(i=3),总的来说还是一种较易上手的算法。

先画图

 

对于这种关系图的表示然后转换为关系矩阵表示,对于可达的两个点u,v则用有序对<u,v>表示u可达v,对于不可达的两点则令有序对<u,v>=∞,因为不存在自回路,所以<u,u>=0

所以上面的关系图用关系矩阵表示则是


对于两个点a,b之间的距离是x,那么<a,b>只有一种距离,但是如果现在引入一个新的点c,且a,c可达,c,b可达,令<a,c>=y,<c,b>=z。如果这个时候发现<a,b>><a,c>+<c,b>x>y+z,那么这个时候我们就用<a,c>+<c,b>替换<a,b>,对应到上面那个关系图就可以发现,<1,3>=6,但是<1,2>+<2,3>=5,所以就用<1,2>+<2,3>=5来替换<1,3>=6,这时<1,3>=5。那么这个时候关系矩阵就变成了下图这样

同理将余下的所有点进行整理可以得到最后的关系矩阵

以上所说的遍历所有点然后进行整理的就是Floyd算法的核心步骤,整个核心步骤只有5行代码

 

for(k=1;k<=n;k++)
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
			if(e[i][j]>e[i][k]+e[k][j])
				e[i][j]=e[i][k]+e[k][j];
笔者作为菜鸡一只目前就只能理解到这么深了,等笔者再多学一些说不定下次就可以写Dijkstra算法了QAQ~~~

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值