【UOJ#177】欧拉回路

【UOJ#177】欧拉回路

题面

UOJ

题解

首先图不连通就没啥好搞的了。
对于无向图而言,每个点度数为偶数。
对于有向图而言,每个点入度等于出度。
然后就是一本通上有的做法,直接\(dfs\)一遍就好了。。

#include<iostream>
#include<cstdio>
using namespace std;
#define MAX 100100
inline int read()
{
    int x=0;bool t=false;char ch=getchar();
    while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    if(ch=='-')t=true,ch=getchar();
    while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
    return t?-x:x;
}
struct Line{int v,next;}e[MAX<<2];
int h[MAX],cnt=2,dg1[MAX],dg2[MAX];bool vis[MAX<<1];
inline void Add(int u,int v){e[cnt]=(Line){v,h[u]};h[u]=cnt++;dg1[u]++,dg2[v]++;}
int t,m,n,ans[MAX<<1],tot;
void dfs(int u)
{
    for(int &i=h[u];i;i=e[i].next)
    {
        if(vis[i>>(t&1)])continue;int j=i;
        vis[i>>(t&1)]=true;dfs(e[i].v);
        ans[++tot]=(((t&1)&(j&1))?-1:1)*(j>>(t&1));
    }
}
int main()
{
    t=read();n=read();m=read();
    for(int i=1;i<=m;++i)
    {
        int u=read(),v=read();
        Add(u,v);if(t&1)Add(v,u);
    }
    for(int i=1;i<=n;++i)if((t==1&&((dg1[i]&1)||(dg2[i]&1)))||(t==2&&dg1[i]!=dg2[i])){puts("NO");return 0;}
    dfs(e[2].v);
    if(tot<m){puts("NO");return 0;}
    puts("YES");for(int i=tot;i;--i)printf("%d ",ans[i]-t+1);puts("");
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/cjyyb/p/10459181.html