求欧拉路径模版 fleury算法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求欧拉路径模版 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算法的主要内容,如果未能解决你的问题,请参考以下文章

Fleury 算法

HihoCoder1182 欧拉路(Fleury算法)

Fleury 欧拉回路

欧拉筛法求素数模版

欧拉回路与欧拉路径

[POJ2337]Catenyms