一本通欧拉回路

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 }

 

以上是关于一本通欧拉回路的主要内容,如果未能解决你的问题,请参考以下文章