简单的Fleury算法模板

假设数据输入时采用如下的格式进行输入:首先输入顶点个数n和边数m,然后输入每条边,每条边的数据占一行,格式为:u,v,表示从顶点u到顶点v的一条有向边

 

这里把欧拉回路的路径输出了出来:

 手写栈:

 1 #include <iostream>

 2 #include <cstdio>

 3 #include <cstring>

 4 using namespace std;

 5 #define N 1005

 6 int first[N],k,degree[N],visit[N];

 7 struct stack{

 8     int top,node[N];

 9 }s;

10 struct Path{

11     int y,next,flag;

12 }path[N<<1];

13 void add(int x,int y)

14 {

15     path[k].y=y,path[k].next=first[x],path[k].flag=k;

16     first[x]=k;

17     k++;

18     path[k].y=x,path[k].next=first[y],path[k].flag=k-1;

19     first[y]=k;

20     k++;

21 }

22 void dfs(int u)

23 {

24     s.node[++s.top]=u;

25     for(int i=first[u];i!=-1;i=path[i].next){

26         if(!visit[path[i].flag]){

27             visit[path[i].flag]=1;

28             dfs(path[i].y);

29             break;

30         }

31     }

32 }

33 void Fleury(int x)

34 {

35     int b;

36     s.top=0;

37     s.node[s.top]=x;

38     while(s.top>=0){

39         b=0;

40         int u=s.node[s.top];

41         for(int i=first[u];i!=-1;i=path[i].next){

42             if(!visit[path[i].flag]){

43                 b=1;

44                 break;

45             }

46         }

47         if(b==0){//如果没有点可以扩展

48             printf("%d ",s.node[s.top]);

49             s.top--;

50         }

51         else{

52             s.top--;

53             dfs(s.node[s.top+1]);

54         }

55     }

56 }

57 int main()

58 {

59     int n,m,u,v;

60     scanf("%d%d",&n,&m);

61     k=0;

62     memset(first,-1,sizeof(first));

63     memset(degree,0,sizeof(degree));

64     memset(visit,0,sizeof(visit));

65     for(int i=0;i<m;i++){

66         scanf("%d%d",&u,&v);

67         add(u,v);

68         degree[u]++,degree[v]++;

69     }

70     int odd=0,st=1;

71     for(int i=1;i<=n;i++){

72         if(degree[i]&1) odd++,st=i;

73     }

74     if(odd==0||odd==2) {Fleury(st);}

75     else printf("No Euler path\n");

76     return 0;

77 }

stl容器栈:

 1 #include <iostream>

 2 #include <cstdio>

 3 #include <cstring>

 4 #include <stack>

 5 using namespace std;

 6 #define N 1005

 7 int first[N],k,degree[N],visit[N];

 8 stack<int> s;

 9 struct Path{

10     int y,next,flag;

11 }path[N<<1];

12 void add(int x,int y)

13 {

14     path[k].y=y,path[k].next=first[x],path[k].flag=k;

15     first[x]=k;

16     k++;

17     path[k].y=x,path[k].next=first[y],path[k].flag=k-1;

18     first[y]=k;

19     k++;

20 }

21 void dfs(int u)

22 {

23     s.push(u);

24     for(int i=first[u];i!=-1;i=path[i].next){

25         if(!visit[path[i].flag]){

26             visit[path[i].flag]=1;

27             dfs(path[i].y);

28             break;

29         }

30     }

31 }

32 void Fleury(int x)

33 {

34     int b;

35     s.push(x);

36     while(!s.empty()){

37         b=0;

38         int u=s.top();

39         for(int i=first[u];i!=-1;i=path[i].next){

40             if(!visit[path[i].flag]){

41                 b=1;

42                 break;

43             }

44         }

45         if(b==0){//如果没有点可以扩展

46             printf("%d ",s.top());

47             s.pop();

48         }

49         else{

50             s.pop();

51             dfs(u);

52         }

53     }

54 }

55 int main()

56 {

57     int n,m,u,v;

58     scanf("%d%d",&n,&m);

59     k=0;

60     memset(first,-1,sizeof(first));

61     memset(degree,0,sizeof(degree));

62     memset(visit,0,sizeof(visit));

63     for(int i=0;i<m;i++){

64         scanf("%d%d",&u,&v);

65         add(u,v);

66         degree[u]++,degree[v]++;

67     }

68     int odd=0,st=1;

69     for(int i=1;i<=n;i++){

70         if(degree[i]&1) odd++,st=i;

71     }

72     if(odd==0||odd==2) {Fleury(st);}

73     else printf("No Euler path\n");

74     return 0;

75 }

 

输入:
9 14
1 2
1 8
2 3
2 8
2 9
3 4
4 5
4 6
4 9
5 6
6 7
6 9
7 8
8 9

结果:

1 2 3 4 5 6 4 9 2 8 7 6 9 8 1

 

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