标签:
对于给定的图G,如果从某个结点出发走一条道路,使得它恰好通过G的每一条边恰好一次,该路径成为欧拉道路。如果该路径起点终点相同,那么成为欧拉回路(可见,欧拉回路是特殊的欧拉道路)。这也是一笔画问题。
不同的图,欧拉道路和回路的判断条件也不同,当然图都必须是连通图。如果是有向图,存在欧拉道路的条件是没有或者只有两个入度不等于出度的点,并且必须是一个点的出度比入度大一(欧拉道路的起点),一个点的入度比出度大一(欧拉道路的终点);如果所有的点入度等于出度,就是欧拉回路了。 而对于无向图,存在欧拉道路的条件是没有或者只有两个奇点,并且必须从一个奇点出发,另一个奇点结束;如果所有点度数均为偶数,则为欧拉回路。
当确定之后,需要打印出欧拉道路,可利用dfs搜索将走过的边压栈。
//适用于无向图 void euler(int u) { for(int v=1; v<=n; v++) { if(G[u][v]) { G[u][v]--; G[v][u]--;//如果是有向图,该句去掉 euler(v); //压栈 Edge tmp; tmp.u = u; tmp.v = v; Stack.push(tmp); } } }
标签:
原文地址:http://blog.csdn.net/tingyu1995/article/details/46563905