uoj117 欧拉回路

求欧拉回路。

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=400010;
int fir[maxn],ne[maxn],to[maxn],res[maxn],vis[maxn],du[maxn],out[maxn],in[maxn],fa[maxn],n,m,clo;
void add(int id,int u,int v)
{
    ne[id]=fir[u];
    fir[u]=id;
    to[id]=v;
}
int find(int x)
{
    return x==fa[x]?x:fa[x]=find(fa[x]);
}
void dfs1(int u)
{
    int i;
    for (i=fir[u],fir[u]=ne[i];i;i=fir[u],fir[u]=ne[i])
        if (!vis[i])
        {
            vis[i]=vis[i^1]=1;
            dfs1(to[i]);
            res[++clo]=(i&1)?-(i/2):i/2;
        }
}
void solve1()
{
    int u,v,last=0;
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++) fa[i]=i;
    for (int i=1;i<=m;i++)
    {
        scanf("%d%d",&u,&v);
        fa[find(u)]=find(v);
        du[u]++;
        du[v]++;
        add(i*2,u,v);
        add(i*2+1,v,u);
    }
    for (int i=1;i<=n;i++)
        if (du[i]&1)
        {
            printf("NO\n");
            return;
        }
    for (int i=1;i<=n;i++)
        if (du[i])
        {
            if (last&&find(i)!=find(last))
            {
                printf("NO\n");
                return;
            }
            last=i;
        }
    printf("YES\n");
    if (last) dfs1(last);
    for (int i=m;i>=1;i--) printf("%d%c",res[i],i==1?'\n':' ');
}
void dfs2(int u)
{
    int i;
    for (i=fir[u],fir[u]=ne[i];i;i=fir[u],fir[u]=ne[i])
        if (!vis[i])
        {
            vis[i]=1;
            dfs2(to[i]);
            res[++clo]=i;
        }
}
void solve2()
{
    int u,v,last=0;
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++) fa[i]=i;
    for (int i=1;i<=m;i++)
    {
        scanf("%d%d",&u,&v);
        fa[find(u)]=find(v);
        out[u]++;
        in[v]++;
        add(i,u,v);
    }
    for (int i=1;i<=n;i++)
        if (out[i]!=in[i])
        {
            printf("NO\n");
            return;
        }
    for (int i=1;i<=n;i++)
        if (in[i])
        {
            if (last&&find(i)!=find(last))
            {
                printf("NO\n");
                return;
            }
            last=i;
        }
    printf("YES\n");
    if (last) dfs2(last);
    for (int i=m;i>=1;i--) printf("%d%c",res[i],i==1?'\n':' ');
}
int main()
{
    //freopen("a.in","r",stdin);
    //freopen("a.out","w",stdout);
    int t;
    scanf("%d",&t);
    if (t==1) solve1();
    else solve2();
}

猜你喜欢

转载自blog.csdn.net/sdfzyhx/article/details/75024137