一本通欧拉回路

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 }

 

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

信息学奥赛一本通 1341:例题一笔画问题

一本通 3.4.1 图的遍历

欧拉回路的判定规则: 1.如果通奇数桥的城区多余两个,则不存在欧拉回路。 2.如果只有两个城区通

HDU5883 The Best Path(欧拉回路 | 通路下求XOR的最大值)

欧拉路径和欧拉回路判断方法

暑期集训第一场欧拉回路 | 思维 | 数论构造 | 容斥原理 | 线段树 | 归并排序