以字母为节点,字符串为有向边,寻找有向图的欧拉通路。
先回顾一下欧拉通路与回路的定义:
定义:
欧拉通路 (欧拉迹):通过图中每条边且只通过一次,并且经过每一顶点的通路。
欧拉回路 (欧拉闭迹):通过图中每条边且只通过一次,并且经过每一顶点的回路。
欧拉图:存在欧拉回路的图。
简单说欧拉通路就是首尾不相接,而欧拉回路要求首尾相接。
无向图是否具有欧拉通路或回路的判定:
欧拉通路:图连通;图中只有2个度为奇数的节点(就是欧拉通路的2个端点)
欧拉回路:图连通;图中所有节点度均为偶数
有向图是否具有欧拉通路或回路的判定:
欧拉通路:图连通;除2个端点外其余节点入度=出度;1个端点入度比出度大1;一个端点入度比出度小1
欧拉回路:图连通;所有节点入度=出度
本题的情况是“有向图是否具有欧拉通路的判定 ,即:除2个端点外其余节点入度=出度;1个端点入度比出度大1;一个端点入度比出度小1
本题的解法是
套圈法
算法思想的朴素表达
对于欧拉图,从一个节点出发,随便往下走(走过之后需要标记一下,下次就不要来了),必然也在这个节点终止(因为除了起始节点,其他节点的度数都是 偶数,只要能进去就能出来)。这样就构成了一个圈,但因为是随便走的,所以可能会有些边还没走过就回来了。我们就从终止节点逆着往前查找,直到找到第一个 分叉路口,然后从这个节点出发继续上面的步骤,肯定也是可以找到一条回到这个点的路径的,这时我们把两个圈连在一起。 当你把所有的圈都找出来后,整个欧拉 回路的寻找就完成了。
寻找欧拉回路时,起始节点是可以任意选择的。如果是有基度顶点要寻找欧拉通路,则从基度顶点出发就好了,上述步骤依然有效。
参考:http://blog.csdn.net/logic_nut/archive/2009/08/23/4474307.aspx