码迷,mamicode.com
首页 > 其他好文 > 详细

hiho欧拉路径(自留)

时间:2015-08-01 08:50:47      阅读:99      评论:0      收藏:0      [点我收藏+]

标签:

无向图

因为DFS本身就是一个入栈出栈的过程,所以我们直接利用DFS的性质来实现栈,其伪代码如下:

DFS(u):
	While (u存在未被删除的边e(u,v))
		删除边e(u,v)
		DFS(v)
	End
	PathSize ← PathSize + 1
	Path[ PathSize ] ← u
技术分享
 1 /**
 2 2015.6.14
 3 hiho一下 第五十周
 4 欧拉路求路径
 5 */
 6 
 7 #include<algorithm>
 8 #include<iostream>
 9 #include<cstring>
10 #include<cstdio>
11 #define maxn 1005
12 using namespace std;
13 
14 struct edge{
15     bool pass;
16     int num;
17     int v;
18     int next;
19 }e[maxn*10];
20 int cor;
21 int head[maxn];
22 int in[maxn];
23 void add(int u,int v,int num){
24     in[v]++;
25     e[cor].v=v;
26     e[cor].num=num;
27     e[cor].pass=false;
28     e[cor].next=head[u];
29     head[u]=cor++;
30 }
31 int path[maxn*10],A;
32 void Init(){
33     A=cor=0;
34     memset(head,-1,sizeof(head));
35     memset(in,0,sizeof(in));
36 }
37 
38 void dfs(int u0){
39     int u=head[u0];
40     while(u!=-1){
41         if(!e[u].pass){
42             e[u].pass=true;
43             e[u^1].pass=true;
44             dfs(e[u].v);
45         }
46         u=e[u].next;
47     }
48     path[A++]=u0;
49 }
50 void Start(){
51     int n,m;
52     while(~scanf("%d%d",&n,&m)){
53         int u,v;
54         Init();
55         for(int i=1;i<=m;i++){
56             scanf("%d%d",&u,&v);
57             add(u,v,i);
58             add(v,u,i);
59         }
60         u=1;
61         for(int i=2;i<=n;i++) if(in[i]%2){
62             u=i;break;
63         }
64         dfs(u);
65         for(int i=A-1;i>=0;i--){
66             if(i==0) printf("%d",path[i]);
67             else printf("%d ",path[i]);
68         }
69         printf("\n");
70     }
71 }
72 void End(){}
73 int main(){
74     Start();
75     End();
76     return 0;
77 }
View Code

 



有向图

对于有向图,其存在欧拉路的条件是,至多有两个点的入度不等于出度,且这两个点满足:其中一个点入度比出度多1,另一个点出度比入度多1

在有向图中找欧拉路的方法,也仍然可以使用Fleury算法。写成伪代码的话:

DFS(u):
	While (以u为起点,且未被删除的边e(u,v))
		删除边e(u,v)
		DFS(v)
	End
	PathSize ← PathSize + 1
	Path[ PathSize ] ← u

但是,有一点要注意,在使用Fleury算法计算有向图的欧拉路时,我们需要将path[]倒序输出才能得到正确的路径。

 

hiho欧拉路径(自留)

标签:

原文地址:http://www.cnblogs.com/usedrosee/p/4693602.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!