[欧拉回路][dfs] Uoj #117 欧拉回路

题目大意

  • 给出一个n个点的有向图或无向图,要求输出其中一条欧拉回路 ( n<=100000 )

题解

  • 听说有个叫环套环的算法,好像实现有点复杂,身为蒟蒻,能水就水
  • 发现有向图和无向图各占50分
  • 我们先可以将每个点的出度和入度都弄出来
  • 对于无向图所有点的度都要是偶数,对于有向图入读必须等于出度
  • 如果都满足,我们就随便从一个点出发,dfs找到一条欧拉回路就ok了

代码

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cstring>
 4 #define N 100010
 5 using namespace std;
 6 int t,n,m,x,y,head[N],num,cnt=1,ans[N*2],in[N],out[N];
 7 bool vis[N*2];
 8 struct edge{int from,to;}e[N*4];
 9 void insert(int x,int y) { e[++cnt].to=y,e[cnt].from=head[x],head[x]=cnt; }
10 void dfs(int x)
11 {
12     for (int &i=head[x];i;i=e[i].from)
13     {
14         int j=i;
15         if (!vis[j>>1]) vis[j>>1]=1,dfs(e[i].to),ans[++num]=j;
16     }
17 }
18 int main()
19 {
20     scanf("%d%d%d",&t,&n,&m);
21     for (int i=1;i<=m;i++)
22     {
23         scanf("%d%d",&x,&y),insert(x,y);
24         if (t==1) insert(y,x),in[x]++,in[y]++; else cnt++,in[y]++,out[x]++;
25     }
26     if (t==1)
27     {
28         for (int i=1;i<=n;i++) if ((in[i]+out[i])&1) { printf("NO"); return 0; }
29     }
30     else 
31     {
32         for (int i=1;i<=n;i++) if (in[i]!=out[i]) { printf("NO"); return 0; }
33     }
34     dfs(x);
35     if (num!=m) printf("NO");
36     else 
37     {
38         printf("YES\n");
39         for (int i=num;i;i--) printf("%d ",ans[i]&1?-(ans[i]>>1):(ans[i]>>1));
40     }
41 }

 

posted @ 2019-07-06 20:14 BEYang_Z 阅读(...) 评论(...) 编辑 收藏