AcWing1184 欧拉回路
模板题,但是有大量重边和自环,数据很坑,需要加引用优化
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> using namespace std; const int N=4e5+10; int h[100010],ne[N],e[N],idx; int ans[N]; int used[N]; int t,n,m; int din[N],dout[N]; int cnt; void add(int a,int b){ e[idx]=b,ne[idx]=h[a],h[a]=idx++; } void dfs(int u){ for(int &i=h[u];i!=-1;){ if(used[i]){ i=ne[i]; continue; } used[i]=1; if(t==1) used[i^1]=1; int x; if(t==1){ x=i/2+1; if(i&1) x=-x; } else{ x=i+1; } int j=e[i]; i=ne[i]; dfs(j); ans[++cnt]=x; } } int main(){ ios::sync_with_stdio(false); cin>>t>>n>>m; int i; memset(h,-1,sizeof h); for(i=1;i<=m;i++){ int a,b; cin>>a>>b; add(a,b); if(t==1) add(b,a); din[b]++,dout[a]++; } if(t==1){ for(i=1;i<=n;i++){ if((din[i]+dout[i])%2!=0){ cout<<"NO"<<endl; return 0; } } } else{ for(i=1;i<=n;i++){ if(din[i]!=dout[i]){ cout<<"NO"<<endl; return 0; } } } for(i=1;i<=n;i++){ if(h[i]!=-1){ dfs(i); break; } } if(cnt<m){ cout<<"NO"<<endl; } else{ cout<<"YES"<<endl; for(i=cnt;i>=1;i--){ cout<<ans[i]<<" "; } cout<<endl; } return 0; }
没有人不辛苦,只有人不喊疼