求欧拉路径模版 fleury算法

支持多重边,按字典序输出。

#include<bits/stdc++.h>
#define REP(i,a,b) for(int i=a;i<=b;i++)
#define MS0(a) memset(a,0,sizeof(a))

using namespace std;

typedef long long ll;
const int maxn=510;
const int INF=1e9+10;

int n,m;
int G[maxn][maxn];
int stk[maxn*3],top;
int path[maxn],pcnt;
int deg[maxn];
int u,v;

void dfs(int u)
{
    stk[++top]=u;
    REP(v,1,n){
        if(G[u][v]){
            G[u][v]--;G[v][u]--;
            dfs(v);break;
        }
    }
}

void fleury(int s)
{
    pcnt=0;
    top=0;stk[++top]=s;
    while(top>0){
        int flag=1;
        REP(v,1,n){
            if(G[stk[top]][v]){
                flag=0;break;
            }
        }
        if(flag) path[++pcnt]=stk[top--];
        else dfs(stk[top--]);
    }
}

int main()
{
    cin>>n>>m;
    REP(i,1,m){
        scanf("%d%d",&u,&v);
        G[u][v]++;G[v][u]++;
        deg[u]++;deg[v]++;
    }
    int ss=0,num=0;
    REP(i,1,n){
        if(deg[i]%2){
            num++;
            if(ss==0) s=i;
        }
    }
    if(num==0||num==2) for(int i=pcnt;i>=1;i--) printf("%d ",path[i]);puts("");
    else puts("-1");
    return 0;
}
View Code

 

你可能感兴趣的:(求欧拉路径模版 fleury算法)