一本通欧拉回路
Posted qq8260573
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一本通欧拉回路相关的知识,希望对你有一定的参考价值。
欧拉回路
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e5+5,M=4e5+5; 4 int t,n,m,tot,in[N],ou[N],ans[M]; 5 int cnt,fro[N],to[M],nxt[M]; 6 bool vis[M]; 7 void add(int x,int y) { 8 to[++cnt]=y,nxt[cnt]=fro[x]; fro[x]=cnt; 9 in[y]++,ou[x]++; 10 } 11 12 void DFS(int x) { 13 for(int &i=fro[x];i;i=nxt[i]) { 14 int h=i; 15 if(t==1) { 16 int k=(i+1)>>1; 17 if(!vis[k]) { 18 vis[k]=1; DFS(to[i]); 19 if(h&1) ans[++tot]=k; else ans[++tot]=-k; 20 } 21 } 22 else if(!vis[i]) { 23 vis[i]=1; DFS(to[i]); 24 ans[++tot]=h; 25 } 26 } 27 } 28 29 int main() { 30 t=read(); 31 n=read(),m=read(); 32 for(int i=1;i<=m;i++) { 33 int u=read(),v=read(); 34 add(u,v); if(t==1) add(v,u); 35 } 36 if(t==1) for(int i=1;i<=n;i++) if(in[i]&1) return printf("NO"),0; 37 if(t==2) for(int i=1;i<=n;i++) if(in[i]^ou[i]) return printf("NO"),0; 38 DFS(to[1]); 39 if(tot<m) return printf("NO"),0; 40 printf("YES\n"); 41 for(int i=tot;i;i--) printf("%d ",ans[i]); 42 }
以上是关于一本通欧拉回路的主要内容,如果未能解决你的问题,请参考以下文章
欧拉回路的判定规则: 1.如果通奇数桥的城区多余两个,则不存在欧拉回路。 2.如果只有两个城区通