Fleury算法 hihoCoder1181 欧拉路·二

Fleury算法用来求欧拉回路的路径,其实就是一种DFS

使用Fleury的前提是,整个图是欧拉回路图(在一个联通图内,且度为奇数的点只有0个或者2个)


#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#include<algorithm>

using namespace std;
typedef long long LL;

const int mod=1e9+7;
const int MX=5000+5;
const int INF=0x3f3f3f3f;

int n,m,r;
int vis[MX],Path[MX];
vector<int>G[MX];

struct Edge{
    int u,v;
    Edge(){}
    Edge(int a,int b){
        u=a;v=b;
    }
    int getv(int x){
        if(u==x) return v;
        return u;
    }
}E[MX];

void Fleury(int u){
    for(int i=0;i<G[u].size();i++){
        int id=G[u][i];
        if(!vis[id]){
            int v=E[id].getv(u);
            vis[id]=1;
            Fleury(v);
        }
    }
    Path[++r]=u;
}

int main(){
    while(~scanf("%d%d",&n,&m)){
        r=0;
        memset(vis,0,sizeof(vis));
        for(int i=1;i<=n;i++){
            G[i].clear();
        }

        for(int i=1;i<=m;i++){
            int u,v;
            scanf("%d%d",&u,&v);
            E[i]=Edge(u,v);
            G[u].push_back(i);
            G[v].push_back(i);
        }

        Fleury(1);
        for(int i=1;i<=r;i++){
            printf("%d%c",Path[i],i==r?'\n':' ');
        }
    }
    return 0;
}


你可能感兴趣的:(Fleury算法 hihoCoder1181 欧拉路·二)