AcWing1184 欧拉回路

模板题,但是有大量重边和自环,数据很坑,需要加引用优化

#include<bits/stdc++.h>
using namespace std;
const int N=4e5+10;
int h[100010],ne[N],e[N],idx;
int ans[N];
int used[N];
int t,n,m;
int din[N],dout[N];
int cnt;
void add(int a,int b){
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void dfs(int u){
    for(int &i=h[u];i!=-1;){
        if(used[i]){
            i=ne[i];
            continue;
        }
        used[i]=1;
        if(t==1)
        used[i^1]=1;
        int x;
        if(t==1){
            x=i/2+1;
            if(i&1)
            x=-x;
        }
        else{
            x=i+1;
        }
        int j=e[i];
        i=ne[i];
        dfs(j);
        ans[++cnt]=x;
        
    }
}
int main(){
    ios::sync_with_stdio(false);
    cin>>t>>n>>m;
    int i;
    memset(h,-1,sizeof h);
    for(i=1;i<=m;i++){
        int a,b;
        cin>>a>>b;
        add(a,b);
        if(t==1)
            add(b,a);
        din[b]++,dout[a]++;
    }
    if(t==1){
        for(i=1;i<=n;i++){
            if((din[i]+dout[i])%2!=0){
                cout<<"NO"<<endl;
                return 0;
            }
        }
    }
    else{
        for(i=1;i<=n;i++){
            if(din[i]!=dout[i]){
                cout<<"NO"<<endl;
                return 0;
            }
        }
    }
    for(i=1;i<=n;i++){
        if(h[i]!=-1){
            dfs(i);
            break;
        }
    }
    if(cnt<m){
        cout<<"NO"<<endl;
    }
    else{
        cout<<"YES"<<endl;
        for(i=cnt;i>=1;i--){
            cout<<ans[i]<<" ";
        }
        cout<<endl;
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/ctyakwf/p/13221488.html