#图论专题(欧拉回路)

该代码使用C++编写,通过深度优先搜索判断给定的图是否为二分图。在第一种情况下检查边的数量是否为偶数,在第二种情况下检查每个节点的入度和出度是否相等。如果满足条件,程序将输出图的边序,否则输出NO。
#include<bits/stdc++.h>
using namespace std;
long long int t,n,m,first[2000005],du[2000005],rd[2000005],cd[2000005],ans[2000005],len=0,tot=0,a,b;
bool v[2000005];
struct node
{
	long long next;
	long long to;
}
edge[2000005];
void dfs(int x)
{
	for(int &e=first[x];e;e=edge[e].next)
	{
		if(!v[e])
		{
			long long int y=e;
			v[e]=1;
			if(t==1)
			{
				if(e%2)
				{
					v[e+1]=1;
				}
				else
				{
					v[e-1]=1;
				}
			}
			dfs(edge[e].to);
			ans[++tot]=y;
		}
	}
	return;
}
int main()
{
	scanf("%lld%lld%lld",&t,&n,&m);
	if(t==1)
	{
		for(int i=1;i<=m;i++)
		{
			scanf("%lld%lld",&a,&b);
			du[a]++;
			du[b]++;
			edge[++len].to=b;
			edge[len].next=first[a];
			first[a]=len;
			edge[++len].to=a;
			edge[len].next=first[b];
			first[b]=len;
		}
		for(int i=1;i<=n;i++)
		{
			if(du[i]%2)
			{
				printf("NO");
				return 0;
			}
		}
	}
	else
	{
		for(int i=1;i<=m;i++)
		{
			scanf("%lld%lld",&a,&b);
			cd[a]++;
			rd[b]++;
			edge[++len].to=b;
			edge[len].next=first[a];
			first[a]=len;
		}
		for(int i=1;i<=n;i++)
		{
			if(rd[i]!=cd[i])
			{
				printf("NO");
				return 0;
			}
		}
	}
	for(int i=1;i<=n;i++)
	{
		if(first[i])
		{
			dfs(i);
			break;
		}
	}
	if(tot!=m)
	{
		printf("NO");
	}
	else
	{
		printf("YES\n");
		if(t==1)
		{
			for(int i=0,x;i<tot;i++)
			{
				x=ans[tot-i];
				if(x%2)
				{
					printf("%lld ",(x+1)/2);
				}
				else
				{
					printf("%lld ",x/(-2));
				}
			}
		}
		else
		{
			for(int i=0;i<tot;i++)
			{
				printf("%lld ",ans[tot-i]);
			}
		}
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值