2012/08/30

欧拉回路的回朔算法



首先算法不会给出所有的回路,当算法结束的时候,得到的仅仅是一个回路,算法检查边的顺序不同会造成结果的回路不同。把所有的边编号,其中的变量的含义g[node][i]是从node出发第i条边到达的节点。

search可以看成是检查当前节点node有没有未用过的边,如果没有就会返回,调用堆栈往上一层,search( g[node][i] )返回说明,边i到达节点g[node][i],但是这个节点无边可用了,我们把i记下来(回朔),然后看看从node出发的其他边能不能前进,如果假设node出来就一条边,那么算法会再往上返回,上面一层会认为node无边可用了,把探索的时候通向node的边也记下来。

分析算法的运行过程,算法一开始从一个节点开始,只要发现没用过的边就往前走,称这时候为探索模式,一直到没有边可用,注意这时候并不代表所有的边都用过了,还可能是当前节点的连接的边都用过了。没有边可用的时候算法开始回朔,回朔的同时记录边,回朔到某个节点,又有没用过的边,算法又开始往前,直到又没有边可用,开始回朔。最后所有的边都用完的时候,算法会一直到回朔到起点,最后记录的是从起点出来的边。

任何边在算法运行过程中只会被用一次,回朔开始的时候必然是到达了一个以前访问过的节点,因为如果到达一个节点,没被访问过,并且又无边可用,这个节点的度为1,不存在欧拉回路。

第一次回朔是什么时候开始的呢?回朔发生以前,站在任何一个节点看,算法必然是进去出来交替发生,对任何一个非起点节点,一进一出我们把节点的度减掉2,可以看出对于非起点节点是不可能发生进去出不来的情况,因为他们的度都是偶数,所以回朔第一次发生必然是在起点,因为起点是直接出来,度只需要减1。

还有一点就是,虽然第一次回朔发生在起点,在回朔的过程中还是会发现有的节点的degree没用完,算法可能再次进入探索模式。也就是当前节点有边可用进入探索模式,无边可用进入回朔模式。

No comments:

Post a Comment

Print This Post