标签:
无向图
因为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 }
有向图
对于有向图,其存在欧拉路的条件是,至多有两个点的入度不等于出度,且这两个点满足:其中一个点入度比出度多1,另一个点出度比入度多1
在有向图中找欧拉路的方法,也仍然可以使用Fleury算法。写成伪代码的话:
DFS(u): While (以u为起点,且未被删除的边e(u,v)) 删除边e(u,v) DFS(v) End PathSize ← PathSize + 1 Path[ PathSize ] ← u
但是,有一点要注意,在使用Fleury算法计算有向图的欧拉路时,我们需要将path[]倒序输出才能得到正确的路径。
标签:
原文地址:http://www.cnblogs.com/usedrosee/p/4693602.html