注意欧拉回路和欧拉路径的区别
#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]);
}