CF858F Wizard's Tour
\(\mathcal{Description}\)
给定一张 \(n\) 个点 \(m\) 条边的无向图,每条边连接两个顶点,保证无重边自环,不保证连通。
你想在这张图上进行若干次旅游,每次旅游可以任选一个点 \(x\) 作为起点,再走到一个与 \(x\) 直接有边相连的点 \(y\),再走到一个与 \(y\) 直接有边相连的点 \(z\) 并结束本次旅游。
作为一个旅游爱好者,你不希望经过任意一条边超过一次,注意一条边不能即正向走一次又反向走一次,注意点可以经过多次,在满足此条件下,你希望进行尽可能多次的旅游,请计算出最多能进行的旅游次数并输出任意一种方案。
\(\mathcal{Solution}\)
20分思路
先提供一个比较傻且只能得20分的思路
就是我们把每条边看做是一个点,距离为一的点之间连一条边
于是问题就变成了求最大匹配了
不过这样会把边的条数大大增大.....
妥妥的TLE
100分思路
若仅是一棵树,那此题的做法还是很显然的
要保证边用的最多,按照树的深度从小到大考虑,即按照拓扑序将能匹配的匹配就是正确的
若不仅是一棵树,我们随便按照一种方式把它的生成树建出来
这样就有非树边和树边,对于每个点,我们先将其与父亲的边不考虑
设其周围有\(n\)条边
若\(n\)为偶数,就可以把它们两两搭配,有\(\frac{n}{2}\)种方法
若\(n\)为奇数,就拿一条边与其与父亲的边搭配,剩下的两两搭配
显然,这样做除了在根节点剩下一条边,其他的边都会被用到
\(\mathcal{Code}\)
实现部分说一下吧
我觉得我打得比其它人的简洁一些吧
大部分人用了一个\(vector\)去记录哪些边
实际上,我们可以直接把这些边匹配
用\(f[x]\)表示是否有一条与\(x\)相连且还没有匹配的边
每次拿到新边看看有没有为匹配的边,有的话它们就匹配
注意一条边只需考虑一次
/*******************************
Author:Morning_Glory
LANG:C++
Created Time:2019年08月30日 星期五 09时08分56秒
*******************************/
#include <cstdio>
#include <fstream>
#include <cstring>
using namespace std;
const int maxn = 1000006;
//{{{cin
struct IO{
template<typename T>
IO & operator>>(T&res){
res=0;
bool flag=false;
char ch;
while((ch=getchar())>'9'||ch<'0') flag|=ch=='-';
while(ch>='0'&&ch<='9') res=(res<<1)+(res<<3)+(ch^'0'),ch=getchar();
if (flag) res=~res+1;
return *this;
}
}cin;
//}}}
int n,m,u,v,cnt,ans;
int head[maxn],nxt[maxn],to[maxn];//edge
int a[maxn],b[maxn],c[maxn],f[maxn];//ans
bool vis[maxn];
//{{{add
void add (int u,int v)
{
nxt[cnt]=head[u],head[u]=cnt,to[cnt++]=v;
}
//}}}
//{{{dfs
void dfs (int x)
{
vis[x]=true;
for (int e=head[x];~e;e=nxt[e]){
int te=to[e];
to[e]=to[e^1]=0;
if (te){
if (!vis[te]) dfs(te);
if (f[te]) a[++ans]=x,b[ans]=te,c[ans]=f[te],f[te]=0;
else if (f[x]) a[++ans]=f[x],b[ans]=x,c[ans]=te,f[x]=0;
else f[x]=te;
}
}
}
//}}}
int main()
{
memset(head,-1,sizeof(head));
cin>>n>>m;
for (int i=1;i<=m;++i) cin>>u>>v,add(u,v),add(v,u);
vis[0]=true;
for (int i=1;i<=n;++i)
if (!vis[i]) dfs(i);
printf("%d\n",ans);
for (int i=1;i<=ans;++i) printf("%d %d %d\n",a[i],b[i],c[i]);
return 0;
}
如有哪里讲得不是很明白或是有错误,欢迎指正
如您喜欢的话不妨点个赞收藏一下吧
CF858F Wizard's Tour的更多相关文章
- CF858F Wizard's Tour 解题报告
题目描述 给定一张 \(n\) 个点 \(m\) 条边的无向图,每条边连接两个顶点,保证无重边自环,不保证连通. 你想在这张图上进行若干次旅游,每次旅游可以任选一个点 \(x\) 作为起点,再走到一个 ...
- 【Codeforces858F】Wizard's Tour [构造]
Wizard's Tour Time Limit: 50 Sec Memory Limit: 512 MB Description Input Output Sample Input 4 5 1 2 ...
- Wizard's Tour
F. Wizard's Tour time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- 「CF858F」 Wizard's Tour
传送门 Luogu 解题思路 首先对于树的情况,我们很显然有一种贪心策略: 对于每一个节点先匹配子树,然后在还可以匹配的儿子间尽可能匹配,要是多出来一个就往上匹配. 推广到图的情况... 我们在图的生 ...
- CodeForces 860D Wizard's Tour
题意 给出一张无向图,要求找出尽量多的长度为2的不同路径(边不可以重复使用,点可以重复使用) 分析 yzy:这是原题 http://www.lydsy.com/JudgeOnline/problem. ...
- Wizard's Tour CodeForces - 860D (图,构造)
大意: 给定$n$节点$m$条边无向图, 不保证连通, 求选出最多邻接边, 每条边最多选一次. 上界为$\lfloor\frac{m}{2}\rfloor$, $dfs$贪心划分显然可以达到上界. # ...
- Codeforces Round #434 (Div. 2)
Codeforces Round #434 (Div. 2) 刚好时间对得上,就去打了一场cf,发现自己的代码正确度有待提高. A. k-rounding 题目描述:给定两个整数\(n, k\),求一 ...
- salesforce 零基础学习(六十)Wizard样式创建数据
项目中表之间关联关系特别多,比如三个表中A,B,C C作为主表,A,B作为从表,有时候C表需要创建数据时,同时需要创建A,B两个表的数据,这种情况下,使用Wizard样式会更加友好. 以Goods_ ...
- Wizard Framework:一个自己开发的基于Windows Forms的向导开发框架
最近因项目需要,我自己设计开发了一个基于Windows Forms的向导开发框架,目前我已经将其开源,并发布了一个NuGet安装包.比较囧的一件事是,当我发布了NuGet安装包以后,发现原来已经有一个 ...
随机推荐
- TLS整理(下):TLS如何保证安全
明文 无法验证服务器的真实性 从而引出了TLS.本篇就来着重介绍下TLS. 说起TLS可能有些人还比较陌生,但如果说到SSL,那知道的人就更多了.TLS其实就是SSL发展而来,版本演进大体为SSL 2 ...
- shell脚本 获取第几行 第几列 的命令 awk sed
例如:我们需要查看 包含 sbin的进程 中的PID号 查看当前所有包含sbin的进程 [root@fea3 ~]# ps aux | grep sbin 只过滤出所有的PID号: [root@fea ...
- net.ipv4.tcp_fin_timeout的错误理解
按照文档的说法,貌似长久以来我对于tcp_fin_timeout的理解都是错误的 先备份在这里,再验证 提高Linux应对短连接的负载能力 在存在大量短连接的情况下,Linux的TCP栈一般都 ...
- git pull There is no tracking information for the current branch.
在高版本的 git下面,也许会看见这样的提示: 解决方案:指定当前工作目录工作分支,跟远程的仓库,分支之间的链接关系. 比如我们设置master对应远程仓库的master分支 git branch - ...
- [原]DOM、DEM、landcover,从tms服务发布格式转arcgis、google服务发布格式
原作:南水之源 先看看tms和google服务器发布数据的数据排列:(goole地图与arcgis一样) 我现在手上有tms发布的数据,dom,dem等,现在要用arcgis server来发布这些数 ...
- 五、postman-sandbox
一.在postman中运行一些JavaScript代码的地方 公共库(javascript) 环境变量与全局变量 动态变量 操作cookie 获取和查看请求及响应 读取数据文件 二.api文档 htt ...
- UniPush使用指南
原贴:https://ask.dcloud.net.cn/article/35622 UniPush使用指南 分类:uni-app Push unipush 从HBuilderX 1.7.2起,uni ...
- Spring cloud微服务安全实战-4-5搭建OAuth2认证服务器
现在可以访问我们的认证服务器,应用我们已经配置好了. 下面配置让用户可以访问我的认证服务器.再来重写一个方法. EndpointConfigure端点的配置. authenticationManage ...
- 【设备问题】罗技M590鼠标无法连接Macbook Pro问题解决
问题现象 罗技蓝牙鼠标连接的时候一直显示连接中,但是一直连接不上. 解决方法 长按那个切换模式的按钮,重置下,再点击连接,显示能够连接成功.
- kafka的ACK
在谈及到Kafka的ACK之前我们要向讲一下Kafka的复制机制,为了保证Kafka的高性能,设计了分区,一个topic的分区是的数据可以分散,然后可以让更多的消费者来进行消费:避免单一分区,只能由一 ...