博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[欧拉回路][dfs] Uoj #117 欧拉回路
阅读量:4955 次
发布时间:2019-06-12

本文共 1356 字,大约阅读时间需要 4 分钟。

题目大意

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

题解

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

代码

1 #include 
2 #include
3 #include
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 }

 

转载于:https://www.cnblogs.com/Comfortable/p/11143989.html

你可能感兴趣的文章
sqlite
查看>>
机电行业如何进行信息化建设
查看>>
Windows Azure Platform Introduction (4) Windows Azure架构
查看>>
【转】chrome developer tool 调试技巧
查看>>
mahout运行测试与kmeans算法解析
查看>>
互相给一巴掌器
查看>>
Android SDK环境变量配置
查看>>
VM10虚拟机安装图解
查看>>
9、总线
查看>>
Git 笔记 - section 1
查看>>
JZOJ 4.1 B组 俄罗斯方块
查看>>
HDU6409 没有兄弟的舞会
查看>>
2018 Multi-University Training Contest 10 - TeaTree
查看>>
HDU6205 card card card
查看>>
2018 Multi-University Training Contest 10 - Count
查看>>
HDU6198 number number number
查看>>
HDU6438 Buy and Resell
查看>>
HDU6446 Tree and Permutation
查看>>
HDU6201 transaction transaction transaction
查看>>
HDU6203 ping ping ping
查看>>