#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;
}
#图论专题(欧拉回路)
最新推荐文章于 2025-12-18 13:46:51 发布
该代码使用C++编写,通过深度优先搜索判断给定的图是否为二分图。在第一种情况下检查边的数量是否为偶数,在第二种情况下检查每个节点的入度和出度是否相等。如果满足条件,程序将输出图的边序,否则输出NO。
607

被折叠的 条评论
为什么被折叠?



