最短路——Floyd算法

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

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

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

先画图

 最短路——Floyd算法_第1张图片

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

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


对于两个点a,b之间的距离是x,那么只有一种距离,但是如果现在引入一个新的点c,且a,c可达,c,b可达,令=y,=z。如果这个时候发现>+x>y+z,那么这个时候我们就用+替换,对应到上面那个关系图就可以发现,<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~~~

 

你可能感兴趣的:(最短路——Floyd算法)