Fleury算法求欧拉回路(一)

  欧拉回路来源于著名的“哥尼斯堡七桥”问题,是由列昂哈德.欧拉提出,别问我为什么知道这么多,因为《离散数学》书上有。

  废话说的有点多,首先,什么是欧拉回路:通过图(此图不是图片)中所有的边一次且仅一次行遍所有顶点的回路称为欧拉回路。

  上面的定义有三个条件,第一:要走遍图里面所有的边和顶点;第二:所有的边都只能走一遍,顶点无所谓;第三:

要有回路,就是你从起点出发,走完所有的边之后,你还要回到起点。这就是要有回路。

     知道定义后,就可以来看算法了。求欧拉回路有两种算法,第一种是Fleury算法,第二种叫逐步插入回路法。 

  Fleury算法:

  (1)任取v0V(G),令P0=v0;

  (2)设pi = v0e1v1e2...eivi已经走遍,按下面方法从E(G)-{e1,e2,e3,...,ei}中选取e(i+1);

1、e(i+1)与vi相关联;

2、除非没有别的边可以走,否则e(i+1)不应该为Gi = G-{e1,e2,e3,...,ei}中的桥

  (3)当(2)不能在进行时,算法停止

  解释一下什么是桥,当一个连通图删除这条边变为两个连通图时,就称这条边为桥。

  例如:下图1中,V3--V4这条边就是桥

图 1 Fleury算法求欧拉回路(一)_第1张图片


  求欧拉回路先要存储图,我是使用一个二维数组eulerGraph[i][j]来存储图中的点和边。若Vi与Vj有边,则eulerGraph[i][j]=eulerGraph[j][i] =1;反之,eulerGraph[i][j]=eulerGraph[j][i] =0;

  其次,要判断该图是否为欧拉图,有一个简便的方法:求每一个点的边的数量,如果每个点它的边的数量都为偶数,则这个图为欧拉图,若有一个点的边不为偶数,这个图就不是欧拉图。

  关于求欧拉图有一个难点,怎么判断这条边是否为桥,解决方法之一,删除这条边,看还有没有另外的方法到达这个点。如上图1中,要判断V3-V4这条边是否为桥,假设先遍历到V3,删除V3-V4,在从V3开始寻找V4若找得到V4则这条边就不是桥,若找遍了所有的点都找不到V4则说明这条边就是桥。(讲起来有点烦,通过程序来看就挺简单的)


  以下是我画的一个流程图:  (技术有些差,将就着看吧)

图 2

Fleury算法求欧拉回路(一)_第2张图片


  搞清楚了算法和流程,接下来就可以编码了。。。















你可能感兴趣的:(c语言,算法,Fleury,欧拉图,回路)