【模板】欧拉回路

版权声明:本文为博主原创文章。 https://blog.csdn.net/qq_37657307/article/details/84582898

题目

注意欧拉回路和欧拉路径的区别

#include<bits/stdc++.h>
using namespace std;
int T,n,m,aa;
bool f1[200005],vis[200005],f2[200005];
int a1[200005][2],c[200005],id[200005],ans[200005],s,t,d,t2;
inline int abs(int x)
{
	return x>0?x:-x;
}
inline int Read(){
	char c=getchar();register int x=0,f=1;
	while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+c-'0',c=getchar();
	return x*f;
}
struct mzls
{
	int to,id;
	bool ff;
}as;
vector<mzls>g[200005];
int st[200005];
inline void dfs(int x,int D,int an)
{
	for(int i=st[x];i<(int)g[x].size();i++)
	{
		st[x]++;
		if(!vis[g[x][i].id])
		{
			vis[g[x][i].id]=1;
			dfs(g[x][i].to,D+1,g[x][i].ff==0?g[x][i].id:-g[x][i].id);
		}
		i=st[x]-1;
	}		
	ans[++t2]=an;
}
int main()
{
	scanf("%d%d%d",&T,&n,&m);
	if(!m)
	{
		printf("YES");
		return 0;
	}
	else if(T==2)
	{
		for(int i=1;i<=m;i++)
		{
			int x=Read(),y=Read();
			aa=x;
			a1[x][0]++;
			a1[y][1]++;
			as.to=y,as.id=i;
			g[x].push_back(as);
		}
		for(int i=1;i<=n;i++)
			if(a1[i][0]>a1[i][1]||a1[i][0]<a1[i][1])
			{
				printf("NO\n");
				return 0;
			}
	}
	else
	{
		for(int i=1;i<=m;i++)
		{
			int x=Read(),y=Read();
			as.id=i;
			as.to=x;
			as.ff=1;
			aa=x;
			g[y].push_back(as);
			as.to=y;
			as.ff=0;
			g[x].push_back(as);
			a1[x][0]++,a1[y][0]++;
		}
		int t1=0;
		for(int i=1;i<=n;i++)
			if(a1[i][0]%2==1)
			{
				printf("NO\n");
				return 0;
			}
	}
	dfs(aa,0,0);
	for(int i=m;i>=1;i--)
		if(ans[i]==0)
		{
			printf("NO\n");
			return 0;
		}
	printf("YES\n");
	for(int i=m;i>1;i--)
		printf("%d ",ans[i]);
	printf("%d\n",ans[1]);
}

猜你喜欢

转载自blog.csdn.net/qq_37657307/article/details/84582898