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 }

 

你可能感兴趣的:(算法)