BUPT2017 wintertraining(15) #7A

题意

给你一个图,n个点m条边,求走遍所有边,至少经过几次点,及输出依次经过的点。n and m (2 ≤ n ≤ 10^5, 1 ≤ m ≤ 2·10^5)

样例

Input

9 5

2 4

2 6

3 5

3 9

5 9

Output

7

3 9 5 3 6 2 4

Input

4 5

1 2

1 3

1 4

2 4

3 4

Output

6

4 3 1 4 2 1

题解

首先依次从度数为奇数的点出发,走完所有的链。接着把和链相连的环走完,走环的时候用的是走欧拉路径(这里算是欧拉回路)的方法。再把剩下的环走完。

重点是,需要模拟一个链表来连接链和链上的环。

代码

  1. #include <cstdio>
  2. #define N 100005
  3. #define M 400005
  4. using namespace std;
  5. int n,m;
  6. struct edge{
  7. int to,next;
  8. bool vis;
  9. }e[M];
  10. int head[N],cnt=2;
  11. int du[N];//点的度数
  12. int idx[N];//点在s中的序号
  13. int ans,sub;//sub是可以减去的步数
  14. int s[M];//存储答案链表
  15. int nxt[M];//nxt[i]代表s[i]在链表中的下一个
  16. void add(int u,int v){
  17. ++du[u];
  18. e[cnt]=(edge){v,head[u]};
  19. head[u]=cnt++;
  20. }
  21. void dfs(int x){
  22. nxt[ans]=ans+1;
  23. s[++ans]=x;
  24. idx[x]=ans;
  25. for(int &i=head[x];i;i=e[i].next){
  26. if(e[i].vis)continue;
  27. e[i].vis=e[i^1].vis=true;
  28. --du[x],--du[e[i].to];
  29. dfs(e[i].to);
  30. break;//每次只找出一条连续的链
  31. }
  32. }
  33. //找出欧拉回路
  34. void dfs2(int x){
  35. for(int &i=head[x];i;i=e[i].next){
  36. if(e[i].vis)continue;
  37. e[i].vis=e[i^1].vis=true;
  38. --du[x],--du[e[i].to];
  39. dfs2(e[i].to);
  40. }
  41. nxt[ans]=ans+1;
  42. s[++ans]=x;
  43. }
  44. int main() {
  45. #ifdef _LOCAL
  46. freopen("in.txt","r",stdin);
  47. #endif
  48. scanf("%d%d",&n,&m);
  49. for(int i=1,u,v;i<=m;++i){
  50. scanf("%d%d",&u,&v);
  51. add(u,v);add(v,u);
  52. }
  53. for(int i=1;i<=n;++i)
  54. if(du[i]&1)dfs(i);//走完所有的链
  55. #ifdef _LOCAL
  56. for(int i=1;i<=ans;++i)printf("%d ",s[i]);
  57. puts("");
  58. #endif
  59. for(int i=1;i<=n;++i)
  60. if(idx[i]&&du[i]){//把链上连着的环走完
  61. int t=ans;
  62. dfs2(i);
  63. nxt[idx[i]]=t+2;
  64. nxt[ans]=idx[i]+1;
  65. nxt[t]=0;
  66. ++sub;
  67. }
  68. for(int i=1;i<=n;++i)
  69. if(du[i])dfs2(i);//走完剩下的环
  70. printf("%d\n",ans-sub);
  71. if(ans-sub)for(int p=1;p;p=nxt[p])printf("%d ",s[p]);
  72. return 0;
  73. }

ps:这题我断断续续补了五天,尤其是生日那天,本来希望做出这题来庆祝生日,很惨的是跨越了那天也没有做出来。后来只好看yt的代码才写出来。其实也不是很难啊,就是不容易想到准确的思路,wa了好几天。加油加油啊!!

【Gym 100812C】Story of Princess (走完图所有边)的更多相关文章

  1. 有个人想上一个n级的台阶,每次只能迈1级或者迈2级台阶,问:这个人有多少种方法可以把台阶走完?

    有个人想上一个n级的台阶,每次只能迈1级或者迈2级台阶,问:这个人有多少种方法可以把台阶走完? 相关问题: (1)有个人想上一个n级的台阶,每次只能迈1级或者迈2级台阶,问:这个人有多少种方法可以把台 ...

  2. 计算机专业如何高质量的走完大学四年?毕业成为Offer收割机

    前言:迷茫本就是青春该有的模样,但不要让未来的你讨厌现在的自己. "就要毕业了. 回头看自己所谓的大学生活, 我想哭,不是因为离别,而是因为什么都没学到. 我不知,简历该怎么写,若是以往我会 ...

  3. git 一口气带你走完git之旅

    1.git是目前世界上最先进的分布式版本控制系统.svn是集成式版本控制系统,那么问题来了,什么叫分布式管理和集中式管理? 首先,svn 需要有一个中央服务器,协同开发者需要同中央服务器连接,所有的版 ...

  4. 【算法】——递归:小白正在上楼梯,楼梯有n阶台阶,小白一次可以上1阶,2阶或者3阶,实现一个方法,计算小白有多少种走完楼梯的方式。

    分析:从最后一步分析,能有的情况有三种情况构成,写出如图所示的方程 //和斐波拉契相似 int void f(int n) { //考虑出口 ) ;//正常思路是返回0 ) ;//通过自己想可以得出只 ...

  5. js实现最短时间走完不同速度的路程

    题目: 现在有一条公路,起点是0公里,终点是100公里.这条公路被划分为N段,每一段有不同的限速.现在他们从A公里处开始,到B公里处结束.请帮他们计算在不超过限速的情况下,最少需要多少时间完成这段路程 ...

  6. cookie存验证码时间,时间没走完不能再次点击

    <script> var balanceSeconds=getcookie('Num'); console.log(balanceSeconds) var timer; var isCli ...

  7. 【算法】js实现最短时间走完不同速度的路程

    题目: 现在有一条公路,起点是0公里,终点是100公里.这条公路被划分为N段,每一段有不同的限速.现在他们从A公里处开始,到B公里处结束.请帮他们计算在不超过限速的情况下,最少需要多少时间完成这段路程 ...

  8. [NOI导刊2011]影像之结构化特征

    问题描述 在影像比对中,有一种方法是利用影像中的边缘(edge)资讯,计算每个边缘资讯中具有代表性的结构化特征,以作为比对两张影像是否相似的判断标准.Water-filling方法是从每个边缘图的一个 ...

  9. 10day1

    但愿复赛的时候旁边坐的不是学军镇海杭二绍一的众神犇.   阅览室 模拟 [问题描述] 一个阅览室每天都要接待大批读者.阅览室开门时间是 0,关门时间是 T.每位读者的到达时间都 不一样,并且想要阅读的 ...

随机推荐

  1. ElasticSearch聚合

    前言 说完了ES的索引与检索,接着再介绍一个ES高级功能API – 聚合(Aggregations),聚合功能为ES注入了统计分析的血统,使用户在面对大数据提取统计指标时变得游刃有余.同样的工作,你在 ...

  2. PS制作动感酷炫水人街舞照

    一.打开原图素材,用钢笔工具把人物从图中扣取出来,新建一个812 * 1024像素的文档,把抠出的人物拖进来,过程如下图. 二.用你习惯的修图工具把人物的手.脸部.腰部.袜子通通修掉.再补回衣服在透视 ...

  3. springboot在yml中配置控制台sql打印方法小结

    方法一: logging: level: debug level.io.renren: debug path: logs/ file: admin.log   方法二 logging:    leve ...

  4. Python_服务器与多客户端通信、UDP协议、pycharm打印带颜色输出、时间同步的机制

    1.服务器与多客户端通信 import socket # 创建tcp socket的套接字 sk = socket.socket() # bind sk.bind(('127.0.0.1',8080) ...

  5. 小程序wepy.js框架总结

    wepy.js借鉴了Vue的语法风格和功能特性,对官方提供的框架进行了封装,更贴近于MVVM架构模式,让开发者更加容易上手,增加开发效率.(脏数据处理--是否有标识.是否有响应) 前端开发的对组件化开 ...

  6. 把composer的源切换为 国际的源

      把composer的源切换为 国际的源:composer config -g repo.packagist composer https://packagist.org

  7. Laravel5 创建自定义门面(Facade)

    门面为应用服务容器中的绑定类提供了一个“静态”接口.Laravel 内置了很多门面,你可能在不知道的情况下正在使用它们.Laravel 的门面作为服务容器中底层类的“静态代理”,相比于传统静态方法,在 ...

  8. 小程序和H5互调

    小程序跳H5页面 https://blog.csdn.net/mytljp/article/details/81030687(copy) H5页面跳小程序 https://blog.csdn.net/ ...

  9. centos7之vm11添加网卡

    需求 根据实际需求原来有一块网卡,现在需要新加一块网卡做集群. 1.在虚拟机添加一块网卡,开机后ip a查看是不是新加了一块网卡,下图是为了讲解,其实已经是做完的状态. 2.上满我们看到新加了一块网卡 ...

  10. 【转】 Golang输入输出格式化Printf Springf Fprintf..

    // Go 在传统的`printf` 中对字符串格式化提供了优异的支持. // 这里是一些基本的字符串格式化的人物的例子. package main import "fmt" im ...