笔者要为没有学好的离散买单,所以笔者这次学的算法跟离散有关,其实只是矩阵而已。
离散教材上面有对最短路问题的一些叙述:“任给一个简单带权图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~~~