这里对于实验中用到的两个算法进行简单的介绍和理解
福楼里算法(Fleury算法)在图上求欧拉环游的一种方法。
中国邮递员问题实质上是在具有非负的连通图网络G中找出一条最小权的通过所有边的闭途径。当G是欧拉图的时候,问题转化成为在G中确定一条欧拉环游。
算法的基本原则是:每到一点,就沿该点的关联边中从未走过的一条走,当没有其他选择时,才选择未走过边所导出的子图中的割边。
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
这个算法和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=V\S.若R是空集,则结束\)
\(S3. 修正的d(v_j),对R中每个V_j,令d(v_j)=min\{d(v_j),d(v_k)+w_{kj}\}\)
—————————————————————————————————
简单来说就是选中一个点作为起始点,然后在剩余的点里找到去往选中点权最小的点,然后这个点到每个可以抵达选中点的点(不包括已经用过的点和选中点)进行权值比较(即决定是否绕路)。直到无法优化为止。
顺便一提,ford算法和dijstra算法思路差不多,不过在决定是否绕路时,ford算法是和所有点进行优化比较(包括已经用过的点和选中点)。
原文地址:https://www.cnblogs.com/cmcshenwei/p/Fleury-suan-fa.html