欧拉回路(Uoj117)


#include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<cmath> #include<queue> #define ll long long using namespace std; const int maxn=5000000+1010; inline int read(){ int x=0,f=1;char ch=getchar(); for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1; for(;isdigit(ch);ch=getchar())x=ch-'0'+(x<<3)+(x<<1); return x*f; } int n,m,t,in[maxn],out[maxn]; int tot=1,head[maxn],to[maxn],nx[maxn]; inline void add(int x,int y){ to[++tot]=y;nx[tot]=head[x];head[x]=tot; return; } int ans[maxn],num,stack[maxn],top,st[maxn]; bool book[maxn]; void euler(int u){ stack[++top]=u; st[top]=0; while(top){ int x=stack[top],y=st[top]; int i=head[x]; while(i && book[i])i=nx[i]; if(i){ stack[++top]=to[i]; st[top]=i; head[x]=nx[i]; if(t==1)book[i]=book[i^1]=1; else book[i]=1; } else { top--; ans[++num]=y; } } num--; return ; } int main(){ t=read();n=read();m=read(); for(int i=1;i<=m;i++){ int x=read(),y=read(); add(x,y); in[y]++;out[x]++; if(t==1)add(y,x); } if(t==1){ for(int i=1;i<=n;i++){ if((in[i]+out[i])&1){printf("NO");return 0;} } } else { for(int i=1;i<=n;i++){ if(in[i]!=out[i]){printf("NO");return 0;} } } for(int i=1;i<=n;i++){ if(head[i]){ euler(i);break; } } if(num!=m){printf("NO");return 0;} printf("YES\n"); for(int i=m;i>=1;i--){ if(t==1){ if(ans[i]&1)printf("%d ",-ans[i]/2); else printf("%d ",ans[i]/2); } else printf("%d ",ans[i]-1); } return 0; }