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 }