码迷,mamicode.com
首页 > 其他好文 > 详细

【一本通】欧拉回路

时间:2019-03-27 21:06:33      阅读:222      评论:0      收藏:0      [点我收藏+]

标签:div   nbsp   ==   color   pre   pac   class   oid   i++   

欧拉回路

 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 }

 

【一本通】欧拉回路

标签:div   nbsp   ==   color   pre   pac   class   oid   i++   

原文地址:https://www.cnblogs.com/qq8260573/p/10610527.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!