zoukankan      html  css  js  c++  java
  • 简单的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
    ");
    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
    ");
    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

  • 相关阅读:
    ecnu1624求交集多边形面积
    poj2986A Triangle and a Circle&&poj3675Telescope(三角形剖分)
    poj2194Stacking Cylinders
    zoj2589Circles(平面图的欧拉定理)
    poj1819Disks
    poj3334Connected Gheeves(二分)
    2014 Multi-University Training Contest 5
    hdu3264Open-air shopping malls(二分)
    poj1375Intervals(点到圆的切线)
    级数基础
  • 原文地址:https://www.cnblogs.com/CSU3901130321/p/3949017.html
Copyright © 2011-2022 走看看