Fleury 算法

Posted cmcshenwei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Fleury 算法相关的知识,希望对你有一定的参考价值。

这里对于实验中用到的两个算法进行简单的介绍和理解

Fluery算法

算法简介

福楼里算法(Fleury算法)在图上求欧拉环游的一种方法。

中国邮递员问题实质上是在具有非负的连通图网络G中找出一条最小权的通过所有边的闭途径。当G是欧拉图的时候,问题转化成为在G中确定一条欧拉环游。

算法的基本原则是:每到一点,就沿该点的关联边中从未走过的一条走,当没有其他选择时,才选择未走过边所导出的子图中的割边。

Floyd算法

算法简介

floyd算法可以看作是搜索算法在最短路径的简化算法。即可以通过第三点对所求的a,b两点进行路径距离的优化。而算法的目的就是尽可能多的找到这样的中转点。
我们假定一个邻接矩阵,并且现在只经过1号点,求任意两点最短路程,只需要判断e[i][1]+e[1][j]是不是小于e[i][j],实现这个我们只需要一个简单的遍历代码

 for (i=1;i<n;i++){
    for(j=1;j<n;j++){
        if(e[i][j]>e[i][1]+e[1][j])
            e[i][j] =e[i][1]+e[1][j];
            }
        }
    }

同样的判断2号点,3号点......对于这个过程,再套一个循环,便可以解决,所以最终的算法是

循环k
    循环i
        循环j
            判断 e[i][j]>e[i][k]+e[k][j]
                赋值 e[i][j]=e[i][k]+e[k][j]
            end 判断
        end循环j
    end循环i
end循环k

Dijkstra算法

算法简介

这个算法和Flyod算法比较像,就一并介绍一下。
思路比较简单,算法步骤如下:
—————————————————————————————————
(S1. 令d(v_1)=0, d(v_j)=w_{ij}(权),s={v_1},R=v s={v_2...v_p})
(S2. 在R中寻找一个顶点V_k,使得d(V_k)=min{d(V_j)},R=VS.若R是空集,则结束)
(S3. 修正的d(v_j),对R中每个V_j,令d(v_j)=min{d(v_j),d(v_k)+w_{kj}})
—————————————————————————————————
简单来说就是选中一个点作为起始点,然后在剩余的点里找到去往选中点权最小的点,然后这个点到每个可以抵达选中点的点(不包括已经用过的点和选中点)进行权值比较(即决定是否绕路)。直到无法优化为止。

顺便一提,ford算法和dijstra算法思路差不多,不过在决定是否绕路时,ford算法是和所有点进行优化比较(包括已经用过的点和选中点)。

以上是关于Fleury 算法的主要内容,如果未能解决你的问题,请参考以下文章

HihoCoder1182 欧拉路(Fleury算法)

HihoCoder1181欧拉路(Fleury算法求欧拉路径)

CCF 第六次计算机职业认证 第四题 收货 stl动态存储和fleury算法的综合应用

Fleury 欧拉回路

以下代码片段的算法复杂度

有人可以解释啥是 SVN 平分算法吗?理论上和通过代码片段[重复]