Fleury(佛罗莱)算法求欧拉回路的学习

欧拉回路:简单来说,就是经过图G的每条边一次且仅一次,回到出发点的路径就叫欧拉回路;

我就直接上模板了。。。。

View Code
 1 #include<iostream>
 2 #include<stack>
 3 const int MAXN=111;
 4 using namespace std;
 5 
 6 stack<int>S;
 7 int edge[MAXN][MAXN];
 8 int n,m;
 9 
10 void dfs(int x){
11     S.push(x);
12     for(int i=1;i<=n;i++){
13         if(edge[x][i]>0){
14             edge[i][x]=edge[x][i]=0;//删除此边
15             dfs(i);
16             break;
17         }
18     }
19 }
20 
21 //Fleury算法的实现
22 void Fleury(int x){
23     S.push(x);
24     while(!S.empty()){
25         int b=0;
26         for(int i=1;i<=n;i++){
27             if(edge[S.top()][i]>0){
28                 b=1;
29                 break;
30             }
31         }
32         if(b==0){
33             printf("%d",S.top());
34             S.pop();
35         }else {
36             int y=S.top();
37             S.pop();
38             dfs(y);//如果有,就dfs
39         }
40     }
41     printf("\n");
42 }
43 
44 int main(){
45     scanf("%d%d",&n,&m); //读入顶点数以及边数
46     memset(edge,0,sizeof(edge));
47     int x,y;
48     for(int i=1;i<=m;i++){
49         scanf("%d%d",&x,&y);
50         edge[x][y]=edge[y][x]=1;
51     }
52     //如果存在奇数顶点,则从奇数顶点出发,否则从顶点0出发
53     int num=0,start=1;
54     for(int i=1;i<=n;i++){                        //判断是否存在欧拉回路
55         int degree=0;
56         for(int j=1;j<=n;j++){
57             degree+=edge[i][j];
58         }
59         if(degree&1){
60             start=i,num++;
61         }
62     }
63     if(num==0||num==2){
64         Fleury(start);
65     }else
66         printf("No Euler Path\n");
67     return 0;
68 }
原文地址:https://www.cnblogs.com/wally/p/2963189.html