求欧拉回路。
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=400010;
int fir[maxn],ne[maxn],to[maxn],res[maxn],vis[maxn],du[maxn],out[maxn],in[maxn],fa[maxn],n,m,clo;
void add(int id,int u,int v)
{
ne[id]=fir[u];
fir[u]=id;
to[id]=v;
}
int find(int x)
{
return x==fa[x]?x:fa[x]=find(fa[x]);
}
void dfs1(int u)
{
int i;
for (i=fir[u],fir[u]=ne[i];i;i=fir[u],fir[u]=ne[i])
if (!vis[i])
{
vis[i]=vis[i^1]=1;
dfs1(to[i]);
res[++clo]=(i&1)?-(i/2):i/2;
}
}
void solve1()
{
int u,v,last=0;
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++) fa[i]=i;
for (int i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
fa[find(u)]=find(v);
du[u]++;
du[v]++;
add(i*2,u,v);
add(i*2+1,v,u);
}
for (int i=1;i<=n;i++)
if (du[i]&1)
{
printf("NO\n");
return;
}
for (int i=1;i<=n;i++)
if (du[i])
{
if (last&&find(i)!=find(last))
{
printf("NO\n");
return;
}
last=i;
}
printf("YES\n");
if (last) dfs1(last);
for (int i=m;i>=1;i--) printf("%d%c",res[i],i==1?'\n':' ');
}
void dfs2(int u)
{
int i;
for (i=fir[u],fir[u]=ne[i];i;i=fir[u],fir[u]=ne[i])
if (!vis[i])
{
vis[i]=1;
dfs2(to[i]);
res[++clo]=i;
}
}
void solve2()
{
int u,v,last=0;
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++) fa[i]=i;
for (int i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
fa[find(u)]=find(v);
out[u]++;
in[v]++;
add(i,u,v);
}
for (int i=1;i<=n;i++)
if (out[i]!=in[i])
{
printf("NO\n");
return;
}
for (int i=1;i<=n;i++)
if (in[i])
{
if (last&&find(i)!=find(last))
{
printf("NO\n");
return;
}
last=i;
}
printf("YES\n");
if (last) dfs2(last);
for (int i=m;i>=1;i--) printf("%d%c",res[i],i==1?'\n':' ');
}
int main()
{
//freopen("a.in","r",stdin);
//freopen("a.out","w",stdout);
int t;
scanf("%d",&t);
if (t==1) solve1();
else solve2();
}