Fleury 求欧拉回路

思想就是有别的选择就不走桥。

加一个dfs.

看代码自行理解,我也没理解完全。

欧拉回路或欧拉通路的判别定理:度为奇数的顶点数目为2或0,为2有欧拉通路,起点和终点就是度为奇数的点,为0有欧拉回路,起点任意。

View Code
 1 #include <cstdio>
 2 #include <cstring>
 3 #define MAXN 100
 4 bool edge[MAXN][MAXN];
 5 int n;
 6 int mystack[MAXN];
 7 int top;
 8 void dfs(int x)
 9 {
10     int i;
11     mystack[top++] = x;
12     for(i = 1; i<= n; i++)
13     {
14         if(edge[i][x])
15         {
16             edge[i][x] = false;
17             edge[x][i] = false;
18             dfs(i);
19             break;
20         }
21     }
22 }
23 void Fleury(int x)
24 {
25     top = 0;
26     int i;
27     mystack[top++] = x;
28     while(top > 0)
29     {
30         bool flag = false;
31         top--;
32         for(i=1; i<=n; i++)
33         {
34             if(edge[i][mystack[top]])
35             {
36                 flag = true;
37                 break;
38             }
39         }
40         if(flag)
41         {
42             dfs(mystack[top]);
43         }
44         else
45         {
46             printf("%d ",mystack[top]);
47         }
48     }
49 }
50 int main()
51 {
52     freopen("in.cpp","r",stdin);
53     int i,j;
54     int m;
55     scanf("%d%d",&n,&m);
56     memset(edge,0,sizeof(edge));
57     for(i=0; i<m; i++)
58     {
59         int u,v;
60         scanf("%d%d",&u,&v);
61         edge[v][u] = edge[u][v]  = true;
62     }
63     int num = 0;
64     int start = 1;
65     for(i =1; i<=n; i++)
66     {
67         int degree = 0;
68         for(j=1; j<=n; j++)
69             degree += edge[i][j];
70         if(degree&1)
71         {
72             start = i;
73             num++;
74         }
75     }
76     if(num == 0 || num == 2)
77         Fleury(start);
78     else
79         printf("No Euler path\n");
80     return 0;
81 }

 

posted on 2013-04-03 00:40  allh123  阅读(172)  评论(0编辑  收藏  举报

导航