【Gym 100812C】Story of Princess (走完图所有边)
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
题解
首先依次从度数为奇数的点出发,走完所有的链。接着把和链相连的环走完,走环的时候用的是走欧拉路径(这里算是欧拉回路)的方法。再把剩下的环走完。
重点是,需要模拟一个链表来连接链和链上的环。
代码
#include <cstdio>
#define N 100005
#define M 400005
using namespace std;
int n,m;
struct edge{
int to,next;
bool vis;
}e[M];
int head[N],cnt=2;
int du[N];//点的度数
int idx[N];//点在s中的序号
int ans,sub;//sub是可以减去的步数
int s[M];//存储答案链表
int nxt[M];//nxt[i]代表s[i]在链表中的下一个
void add(int u,int v){
++du[u];
e[cnt]=(edge){v,head[u]};
head[u]=cnt++;
}
void dfs(int x){
nxt[ans]=ans+1;
s[++ans]=x;
idx[x]=ans;
for(int &i=head[x];i;i=e[i].next){
if(e[i].vis)continue;
e[i].vis=e[i^1].vis=true;
--du[x],--du[e[i].to];
dfs(e[i].to);
break;//每次只找出一条连续的链
}
}
//找出欧拉回路
void dfs2(int x){
for(int &i=head[x];i;i=e[i].next){
if(e[i].vis)continue;
e[i].vis=e[i^1].vis=true;
--du[x],--du[e[i].to];
dfs2(e[i].to);
}
nxt[ans]=ans+1;
s[++ans]=x;
}
int main() {
#ifdef _LOCAL
freopen("in.txt","r",stdin);
#endif
scanf("%d%d",&n,&m);
for(int i=1,u,v;i<=m;++i){
scanf("%d%d",&u,&v);
add(u,v);add(v,u);
}
for(int i=1;i<=n;++i)
if(du[i]&1)dfs(i);//走完所有的链
#ifdef _LOCAL
for(int i=1;i<=ans;++i)printf("%d ",s[i]);
puts("");
#endif
for(int i=1;i<=n;++i)
if(idx[i]&&du[i]){//把链上连着的环走完
int t=ans;
dfs2(i);
nxt[idx[i]]=t+2;
nxt[ans]=idx[i]+1;
nxt[t]=0;
++sub;
}
for(int i=1;i<=n;++i)
if(du[i])dfs2(i);//走完剩下的环
printf("%d\n",ans-sub);
if(ans-sub)for(int p=1;p;p=nxt[p])printf("%d ",s[p]);
return 0;
}
ps:这题我断断续续补了五天,尤其是生日那天,本来希望做出这题来庆祝生日,很惨的是跨越了那天也没有做出来。后来只好看yt的代码才写出来。其实也不是很难啊,就是不容易想到准确的思路,wa了好几天。加油加油啊!!
【Gym 100812C】Story of Princess (走完图所有边)的更多相关文章
- 有个人想上一个n级的台阶,每次只能迈1级或者迈2级台阶,问:这个人有多少种方法可以把台阶走完?
有个人想上一个n级的台阶,每次只能迈1级或者迈2级台阶,问:这个人有多少种方法可以把台阶走完? 相关问题: (1)有个人想上一个n级的台阶,每次只能迈1级或者迈2级台阶,问:这个人有多少种方法可以把台 ...
- 计算机专业如何高质量的走完大学四年?毕业成为Offer收割机
前言:迷茫本就是青春该有的模样,但不要让未来的你讨厌现在的自己. "就要毕业了. 回头看自己所谓的大学生活, 我想哭,不是因为离别,而是因为什么都没学到. 我不知,简历该怎么写,若是以往我会 ...
- git 一口气带你走完git之旅
1.git是目前世界上最先进的分布式版本控制系统.svn是集成式版本控制系统,那么问题来了,什么叫分布式管理和集中式管理? 首先,svn 需要有一个中央服务器,协同开发者需要同中央服务器连接,所有的版 ...
- 【算法】——递归:小白正在上楼梯,楼梯有n阶台阶,小白一次可以上1阶,2阶或者3阶,实现一个方法,计算小白有多少种走完楼梯的方式。
分析:从最后一步分析,能有的情况有三种情况构成,写出如图所示的方程 //和斐波拉契相似 int void f(int n) { //考虑出口 ) ;//正常思路是返回0 ) ;//通过自己想可以得出只 ...
- js实现最短时间走完不同速度的路程
题目: 现在有一条公路,起点是0公里,终点是100公里.这条公路被划分为N段,每一段有不同的限速.现在他们从A公里处开始,到B公里处结束.请帮他们计算在不超过限速的情况下,最少需要多少时间完成这段路程 ...
- cookie存验证码时间,时间没走完不能再次点击
<script> var balanceSeconds=getcookie('Num'); console.log(balanceSeconds) var timer; var isCli ...
- 【算法】js实现最短时间走完不同速度的路程
题目: 现在有一条公路,起点是0公里,终点是100公里.这条公路被划分为N段,每一段有不同的限速.现在他们从A公里处开始,到B公里处结束.请帮他们计算在不超过限速的情况下,最少需要多少时间完成这段路程 ...
- [NOI导刊2011]影像之结构化特征
问题描述 在影像比对中,有一种方法是利用影像中的边缘(edge)资讯,计算每个边缘资讯中具有代表性的结构化特征,以作为比对两张影像是否相似的判断标准.Water-filling方法是从每个边缘图的一个 ...
- 10day1
但愿复赛的时候旁边坐的不是学军镇海杭二绍一的众神犇. 阅览室 模拟 [问题描述] 一个阅览室每天都要接待大批读者.阅览室开门时间是 0,关门时间是 T.每位读者的到达时间都 不一样,并且想要阅读的 ...
随机推荐
- Python常用内建方法:__init__,__new__,__class__的理解
python中所有类都是继承自object, 而object提供了很多原始的内建属性和方法,所以用户自定义的类在Python中也会继承这些内建属性.可以使用dir()函数可以查看,虽然python提供 ...
- 【M2】软件工程终期总结报告——前端设计总结
PhylabWeb——前端设计感想 简介 本文的内容是关于我参与的软件工程项目——“Phylab-Web物理实验中心网站”的前端设计个人总结,来自团队:软剑攻城队 网站地址为:http://buaap ...
- NSAssert和NSParameterAssert
2016.05.05 18:34* 字数 861 阅读 5127评论 0喜欢 17 https://www.jianshu.com/p/3072e174554f NSAssert和NSParamete ...
- mybatis之批量插入
一.导入功能优化 普通for循环,对于导入大量数据时非常耗时.可以通过Mybatis的批量插入功能提高效率.每批次导入的数据不能太多,否则会报错.通过测试发现,每批次200条为宜. 测试结果: 开启事 ...
- 多线程系列之七:Read-Write Lock模式
一,Read-Write Lock模式 在Read-Write Lock模式中,读取操作和写入操作是分开考虑的.在执行读取操作之前,线程必须获取用于读取的锁.在执行写入操作之前,线程必须获取用于写入的 ...
- ansible jenkins war
Ansible is Simple IT Automationhttps://www.ansible.com/ Ansible中文权威指南- 国内最专业的Ansible中文官方学习手册http://a ...
- 监控系统对比 Ganglia vs Open-falcon vs Prometheus vs Zabbix vs Nagios vs PandoraFMS
Zabbix vs Nagios vs PandoraFMS: an in depth comparison - Pandora FMS - The Monitoring Bloghttps://bl ...
- 完美解决safari、微信浏览器下拉回弹效果
CSS代码: .box{ overflow: auto; -webkit-overflow-scrolling: touch; } HTML代码: <body class="box&q ...
- C# Note26: [MethodImpl(MethodImplOptions.Synchronized)]与lock机制
在进行.NET开发时,经常会遇见如何保持线程同步的情况.在众多的线程同步的可选方式中,加锁无疑是最为常用的.如果仅仅是基于方法级别的线程同步,使用System.Runtime.CompilerServ ...
- C# Note7:MVVM模式之数据绑定
一.资源说明 (1)本文参考自: 一步步走进WPF的MVVM模式(二):数据绑定 WPF之数据绑定总结 二.正文 数据绑定 (Data Binding)是WPF最重要的特性之一,也是实现 MVVM( ...