CF858F Wizard's Tour 解题报告
题目描述
给定一张 \(n\) 个点 \(m\) 条边的无向图,每条边连接两个顶点,保证无重边自环,不保证连通。
你想在这张图上进行若干次旅游,每次旅游可以任选一个点 \(x\) 作为起点,再走到一个与 \(x\) 直接有边相连的点 \(y\),再走到一个与 \(y\) 直接有边相连的点 \(z\) 并结束本次旅游。
作为一个旅游爱好者,你不希望经过任意一条边超过一次,注意一条边不能即正向走一次又反向走一次,注意点可以经过多次,在满足此条件下,你希望进行尽可能多次的旅游,请计算出最多能进行的旅游次数并输出任意一种方案。
输入输出格式
输入格式
第 \(1\) 行两个正整数 \(n\) 与 \(m\),表示全图的点数与边数
下接 \(m\) 行,每行两个数字 \(u\) 与 \(v\) 表示一条边
输出格式
第 \(1\) 行一个整数 \(cnt\) 表示答案
下接 \(cnt\) 行,每行三个数字 \(x, y\) 与 \(z\),表示一次旅游的路线
如有多种旅行方案,任意输出一种即可
说明
对于前 \(20\%\) 的数据, \(n \le10, m \le 20\).
对于另 \(20\%\) 的数据, \(m = n - 1\),并且图连通
对于另 \(10\%\) 的数据,每个点的度数不超过 \(2\)
对于 \(100\%\) 的数据, \(n \le 100000, m \le 200000\)
可能还是没怎么做过构造题目吧,我打的树的特殊数据分其实改一改就是正解了。
通过手玩我们发现对一个有\(m\)条边的连通块来说,方案数量一定可以构造到\(\lfloor\frac{m}{2}\rfloor\)个。
构造方法如下
对某个连通块随便选择一个点构造一颗搜索树,在回溯的时候配对可以连接的边,如果不能两两配对,那么用上自己头上的边。
考虑为什么这样是对的,思路很简单。我们发现除了选定根的某个儿子边,所有的边都可以用上,不会产生浪费。
Code:
#include <cstdio>
#include <vector>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define Rep(i,a,b) for(int i=a;i<b;i++)
#define ed() for(int i=head[now];i;i=Next[i])
#define pb(a) push_back(a)
const int N=2e5+10;
int head[N],to[N<<1],Next[N<<1],cnt=1;
void add(int u,int v)
{
to[++cnt]=v,Next[cnt]=head[u],head[u]=cnt;
}
int used[N<<1],ans[N<<2],n,m,tot,vis[N];
void dfs(int now,int fa,int edg)
{
vis[now]=1;
std::vector <int> ch;
ed()
{
int v=to[i];
if(v!=fa&&!vis[v]) dfs(v,now,i);
}
ed()
{
int v=to[i];
if(v!=fa&&!used[i])
{
ch.pb(i);
used[i^1]=1;
}
}
Rep(i,0,ch.size())
{
if(i&1) ans[++tot]=now;
ans[++tot]=to[ch[i]];
}
if(ch.size()&1)
{
if(fa) ans[++tot]=now,ans[++tot]=fa,used[edg]=1;
else tot--;
}
}
int main()
{
scanf("%d%d",&n,&m);
int u,v;
rep(i,1,m) scanf("%d%d",&u,&v),add(u,v),add(v,u);
rep(i,1,n) if(!vis[i]) dfs(i,0,0);
printf("%d\n",tot/3);
rep(i,1,tot)
{
printf("%d ",ans[i]);
if(i%3==0) printf("\n");
}
return 0;
}
2018.10.25
CF858F Wizard's Tour 解题报告的更多相关文章
- 洛谷 P2747 [USACO5.4]周游加拿大Canada Tour 解题报告
P2747 [USACO5.4]周游加拿大Canada Tour 题目描述 你赢得了一场航空公司举办的比赛,奖品是一张加拿大环游机票.旅行在这家航空公司开放的最西边的城市开始,然后一直自西向东旅行,直 ...
- CF858F Wizard's Tour
也许更好的阅读体验 \(\mathcal{Description}\) 给定一张 \(n\) 个点 \(m\) 条边的无向图,每条边连接两个顶点,保证无重边自环,不保证连通. 你想在这张图上进行若干次 ...
- CH Round #56 - 国庆节欢乐赛解题报告
最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...
- 二模13day1解题报告
二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...
- BZOJ 1051 最受欢迎的牛 解题报告
题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4438 Solved: 2353[S ...
- 习题:codevs 2822 爱在心中 解题报告
这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...
- 习题:codevs 1035 火车停留解题报告
本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ...
- 习题: codevs 2492 上帝造题的七分钟2 解题报告
这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHS ...
- 习题:codevs 1519 过路费 解题报告
今天拿了这道题目练练手,感觉自己代码能力又增强了不少: 我的思路跟别人可能不一样. 首先我们很容易就能看出,我们需要的边就是最小生成树算法kruskal算法求出来的边,其余的边都可以删掉,于是就有了这 ...
随机推荐
- Spring笔记1
Spring Spring特点 1. 方便解耦,简化开发 通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合.有了Spring,用户 ...
- Lavavel5.5源代码 - 并发数控制
app('redis')->connection('default')->funnel('key000') // 每个资源最大锁定10秒自动过期,只有60个资源(并发),在3秒内获取不到锁 ...
- Windows环境下安装redis及PHP Redis扩展
附带管理工具安装教程 安装环境 WNMP环境 参考教程:WIN10下WNMP开发环境部署 安装windows的redis服务 安装包下载 选择msi安装包下载并安装,下载可能会有点慢,请自行使用梯子. ...
- hive 学习系列四(用户自定义函数)
如果入参是简单的数据类型,直接继承UDF,实现一个或者多个evaluate 方法. 具体流程如下: 1,实现大写字符转换成小写字符的UDF package com.example.hive.udf; ...
- python基础之初识
一. 计算机是什么 基本组成: 主板+cpu+内存 cpu: 主频, 核数(16) 内存:大小(8G, 16G, 32G) 型号: DDR3, DDR4, DDR5, 主频(海盗船,玩家国度) 显卡: ...
- Qt5 调试之详细日志文件输出(qInstallMessageHandler)
注明:以下方法仅适用于 Qt5 及以上版本 函数说明: QtMessageHandler qInstallMessageHandler(QtMessageHandler handler) 此函数在使 ...
- System.Speech使用
使用微软语音库 使用微软语音库可以很快速的制作一个小应用,比如一个唐诗的朗诵工具.本示例也是使用微软语音库,制作了一个唐诗宋词朗诵的应用,仅供加深学习印象 首先是要引入System.Speech库 然 ...
- ABS(引数と同じ大きさの正の数を返す)
ABS 関数 [数値] 数値式の絶対値を返します. 構文 ABS( numeric-expression ) パラメータ numeric-expression 絶対値が返される数値. 戻り値 数値 ...
- js倒计时页面跳转
HTML: <p><span id="timer">60</span>s 后跳转到百度首页</p> JS: //倒计时方法 func ...
- mysql学习第四天(高级查询)
-- 第七章-- 1.查询入职日期最早和最晚的日期select min(hiredate),max(hiredate)from emp -- 2.查询职位以SALES开头的所有员工平均工资,最低工资, ...