欧拉通路和回路

Fleury算法

欧拉回路放了好久,一直以来就认为他就是判定+dfs,但总有个Fleury压在心头,今天仔细一看,不就是dfs吗?还弄个人名做外套。

Fleury算法:

1.判定该图是否为Euler图,包括有向欧拉通路,有向欧拉回路,无向欧拉通路,无向欧拉回路:

有向欧拉通路:起点:出度-入度=1,终点:入度-出度=1,其它点:入度==出度

有向欧拉回路:所有点:入度==出度

无向欧拉通路:仅有两个奇度点

无向欧拉回路:无奇度点

2.选择起点

3.采用dfs寻找Euler路径。

附无向图欧拉通路(num==2)、欧拉回路(num==0)Fleury模板:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 #define MAXN 200
 5 using namespace std;
 6 struct stack{
 7     int top,node[MAXN];
 8 }s;
 9 int Edge[MAXN][MAXN];
10 int n;
11 void dfs(int x){
12     int i;
13     s.top++;
14     s.node[s.top]=x;
15     for(i=0;i<n;i++){
16         if(Edge[i][x]>0){
17             Edge[i][x]=0;
18             Edge[x][i]=0;
19             dfs(i);
20             break;
21         }
22     }
23 }
24 void Fleury(int x){
25     int i,b;
26     s.top=0;s.node[s.top]=x;
27     while(s.top>=0){
28         b=0;
29         for(i=0;i<n;i++){
30             if(Edge[s.node[s.top]][i]>0){
31                 b=1;break;
32             }
33         }
34         if(b==0){
35             printf("%d ",s.node[s.top]+1);
36             s.top--;
37         }
38         else{
39             s.top--;
40             dfs(s.node[s.top+1]);
41         }
42     }
43     printf("\n");
44 }
45 int main()
46 {
47     freopen("in.txt","r",stdin);
48     int i,j;
49     int m,s,t;
50     int degree,num,start;
51     while(scanf("%d%d",&n,&m)!=EOF){
52         memset(Edge,0,sizeof(Edge));
53         for(i=0;i<m;i++){
54             scanf("%d%d",&s,&t);
55             Edge[s-1][t-1]=1;
56             Edge[t-1][s-1]=1;
57         }
58         num=0;start=0;
59         for(i=0;i<n;i++){
60             degree=0;
61             for(j=0;j<n;j++)
62                 degree+=Edge[i][j];
63             if(degree%2==1){
64                 start=i;
65                 num++;
66             }
67         }
68         if(num==0 || num==2) Fleury(start);
69         else printf("No Euler path\n");
70     }
71     return 0;
72 }

 

posted @ 2015-04-05 11:04  daydaycode  阅读(109)  评论(0编辑  收藏  举报