具体思路就是正常分讨,但是在非零连通块为 1 且是 4 个奇度点时我通过枚举每个跑一边欧拉路然后通过连通性直接在某两个奇点间连了条边(感觉是有路径可以实现的且一定存在删除这些边后剩下两奇点可以构成一条欧拉路径),然后再跑了一遍欧拉路(感觉是假的,求hack!
#include<bits/stdc++.h>
using namespace std;
using pi=pair<int,int>;
mt19937_64 rd(time(0));
const int N=2e4+5;
int m,vis[N],b[N],fa[N],siz[N],ans1[N],ans2[N],ans[N],ans3[N],tot,tt,ttt,tt1,in[N],X,Y,S,T,now[4],cnt;
set<pi>e[N],E[N],by[N];
int find(int x){
return x==fa[x]?x:fa[x]=find(fa[x]);
}
void dfs(int u,bool fg){
while(e[u].size()>0){
pi vt=*e[u].begin();
int v=vt.first,id=vt.second;
e[u].erase({v,id});
e[v].erase({u,id});
dfs(v,fg);
}
if(fg){
ans2[++tot]=u;
return;
}
if(!tot)ans2[++tot]=u;
else{
pi x=*E[u].lower_bound({ans2[tot],0});
E[u].erase(x);
E[ans2[tot]].erase({u,x.second});
ans2[++tot]=u;
ans1[++tt]=x.second;
}
}
void dfs1(int u,int fg){
if(in[u]&1){
if(fg){
X=u;
Y++;
}
else{
S=u;
T++;
}
}
vis[u]=1;
for(auto v=e[u].begin();v!=e[u].end();++v)
if(!vis[(*v).first])dfs1((*v).first,fg);
}
void dfs2(int u){
if(in[u]&1)now[cnt++]=u;
vis[u]=1;
for(auto v=e[u].begin();v!=e[u].end();++v)
if(!vis[(*v).first])dfs2((*v).first);
}
void tg(int t){
for(int i=1;i<=b[0];i++){
e[b[i]].clear();
E[b[i]].clear();
for(auto j=by[b[i]].begin();j!=by[b[i]].end();++j){
e[b[i]].insert(*j);
E[b[i]].insert(*j);
}
}
dfs(now[t],1);
ttt=tot;
tt=tot=tt1=0;
for(int i=1;i<=ttt;i++)ans3[i]=ans2[i];
for(int i=1;i<=b[0];i++){
e[b[i]].clear();
E[b[i]].clear();
for(auto j=by[b[i]].begin();j!=by[b[i]].end();++j){
e[b[i]].insert(*j);
E[b[i]].insert(*j);
}
}
for(int i=ttt;i>1;i--){
auto x=e[ans3[i]].lower_bound({ans3[i-1],0});
if(x==e[ans3[i]].end()||(*x).first!=ans3[i-1])break;
ans[++tt1]=(*x).second;
e[ans3[i]].erase(*x);
E[ans3[i]].erase(*x);
e[ans3[i-1]].erase({ans3[i],(*x).second});
E[ans3[i-1]].erase({ans3[i],(*x).second});
}
bool fg=0;
int U=0;
for(int i=1;i<=b[0];i++)
if(e[b[i]].size()&1){
fg=1;
U=b[i];
}
if(fg)dfs(U,0);
else{
for(int i=1;i<=b[0];i++)
if(e[b[i]].size()>0){
dfs(b[i],0);
break;
}
}
if(tt1+tt!=m)return;
cout<<tt1<<"\n";
for(int i=1;i<=tt1;i++)cout<<ans[i]<<" ";
cout<<"\n"<<tt<<"\n";
for(int i=tt;i;i--)cout<<ans1[i]<<" ";
exit(0);
}
int main(){
// freopen("input.txt","r",stdin);
// freopen("output.txt","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
for(int i=1;i<N;i++)fa[i]=i;
cin>>m;
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
e[x].insert({y,i});
e[y].insert({x,i});
E[x].insert({y,i});
E[y].insert({x,i});
by[x].insert({y,i});
by[y].insert({x,i});
in[x]++;
in[y]++;
int f1=find(x),f2=find(y);
if(f1!=f2){
if(rd()&1)fa[f2]=f1;
else fa[f1]=f2;
}
if(!vis[x]){
vis[x]=1;
b[++b[0]]=x;
}
if(!vis[y]){
vis[y]=1;
b[++b[0]]=y;
}
}
for(int i=1;i<=b[0];i++){
vis[b[i]]=0;
siz[find(b[i])]++;
}
int ct=0;
for(int i=1;i<=b[0];i++)
if(siz[b[i]]>1)ct++;
if(ct>2){
cout<<-1;
exit(0);
}
if(ct==2){
ct=0;
for(int i=1;i<=b[0];i++)
if(siz[b[i]]>1){
if(!ct){
ct=b[i];
dfs1(b[i],1);
if(Y>2){
cout<<-1;
exit(0);
}
}
else{
for(int j=1;j<=b[0];j++)vis[b[j]]=0;
dfs1(b[i],0);
if(T>2){
cout<<-1;
exit(0);
}
}
}
ct=0;
for(int i=1;i<=b[0];i++)
if(siz[b[i]]>1){
if(!ct){
ct=b[i];
if(Y==2)dfs(X,0);
else dfs(b[i],0);
}
else{
tt=tot=0;
if(T==2)dfs(S,0);
else dfs(b[i],0);
}
cout<<tt<<"\n";
for(int i=tt;i;i--)cout<<ans1[i]<<" ";
cout<<"\n";
}
}
else{
for(int i=1;i<=b[0];i++)
if(siz[b[i]]>1){
ct=b[i];
dfs1(b[i],1);
if((Y&1)||Y>4||(Y==2&&siz[b[i]]==2&&e[b[i]].size()<2)){
cout<<-1;
exit(0);
}
}
if(!Y||(Y==2)){
if(!Y)dfs(ct,0);
else dfs(X,0);
cout<<"1\n"<<ans1[tt]<<"\n"<<tt-1<<"\n";
for(int i=tt-1;i;i--)cout<<ans1[i]<<" ";
}
if(Y==4){
for(int j=1;j<=b[0];j++)vis[b[j]]=0;
dfs2(ct);
for(int j=1;j<=b[0];j++)vis[b[j]]=0;
for(int i=0;i<4;i++)tg(i);
}
}
return 0;
}