【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;
}
posted @ 2019-03-01 22:39  小蒟蒻yyb  阅读(433)  评论(0编辑  收藏  举报