也许更好的阅读体验

\(\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的更多相关文章

  1. CF858F Wizard's Tour 解题报告

    题目描述 给定一张 \(n\) 个点 \(m\) 条边的无向图,每条边连接两个顶点,保证无重边自环,不保证连通. 你想在这张图上进行若干次旅游,每次旅游可以任选一个点 \(x\) 作为起点,再走到一个 ...

  2. 【Codeforces858F】Wizard's Tour [构造]

    Wizard's Tour Time Limit: 50 Sec  Memory Limit: 512 MB Description Input Output Sample Input 4 5 1 2 ...

  3. Wizard's Tour

    F. Wizard's Tour time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  4. 「CF858F」 Wizard's Tour

    传送门 Luogu 解题思路 首先对于树的情况,我们很显然有一种贪心策略: 对于每一个节点先匹配子树,然后在还可以匹配的儿子间尽可能匹配,要是多出来一个就往上匹配. 推广到图的情况... 我们在图的生 ...

  5. CodeForces 860D Wizard's Tour

    题意 给出一张无向图,要求找出尽量多的长度为2的不同路径(边不可以重复使用,点可以重复使用) 分析 yzy:这是原题 http://www.lydsy.com/JudgeOnline/problem. ...

  6. Wizard's Tour CodeForces - 860D (图,构造)

    大意: 给定$n$节点$m$条边无向图, 不保证连通, 求选出最多邻接边, 每条边最多选一次. 上界为$\lfloor\frac{m}{2}\rfloor$, $dfs$贪心划分显然可以达到上界. # ...

  7. Codeforces Round #434 (Div. 2)

    Codeforces Round #434 (Div. 2) 刚好时间对得上,就去打了一场cf,发现自己的代码正确度有待提高. A. k-rounding 题目描述:给定两个整数\(n, k\),求一 ...

  8. salesforce 零基础学习(六十)Wizard样式创建数据

    项目中表之间关联关系特别多,比如三个表中A,B,C  C作为主表,A,B作为从表,有时候C表需要创建数据时,同时需要创建A,B两个表的数据,这种情况下,使用Wizard样式会更加友好. 以Goods_ ...

  9. Wizard Framework:一个自己开发的基于Windows Forms的向导开发框架

    最近因项目需要,我自己设计开发了一个基于Windows Forms的向导开发框架,目前我已经将其开源,并发布了一个NuGet安装包.比较囧的一件事是,当我发布了NuGet安装包以后,发现原来已经有一个 ...

随机推荐

  1. JVM synchronized关键字所生成的字节码

    一.创建测试类 package com.example.jvm.bytecode; public class MyTest2 { String str = "Welcome"; p ...

  2. Redis数据库漏洞防护

    Redis是一个高性能的数据库,Redis Crackit及Redis安全漏洞本质上是由于Redis自身缺乏安全防护机制,同时Redis的使用者又未曾遵循官方的安全规范所导致的. Redis安全漏洞 ...

  3. Python 设计模式之建造者模式 Builder Pattern

    #引入建造者模式 肯德基的菜单上有 薯条, 鸡腿,鸡翅,鸡米花,可乐,橙汁,火腿汉堡,至尊虾汉堡,牛肉汉堡 , 鸡肉卷等这些单品,也有很多套餐. 比如 套餐1:鸡翅,至尊虾汉堡,可乐,薯条 套餐2:鸡 ...

  4. nginx的代理配置

    date: 2019-07-19 16:52:18 author: headsen chen   proxy_pass http://aaa /; 如果在proxy_pass末尾的url加/,表示绝对 ...

  5. PHP 二维数组去重(保留各个键值的同时去除重复的项)

    对于如下二维数组,要求对其进行去重: $arr = array( '=>array( 'name'=>'james', , ), '=>array( 'name'=>'susu ...

  6. Vue事件 定义方法执行方法 获取数据 改变数据 执行方法传值 以及事件对象

    <template> <div id="app"> <!-- <img v-bind:src='url' /> <img :src= ...

  7. centos7.6环境zabbix3.2源码编译安装版升级到zabbix4.0长期支持版

    zabbix3.2源码编译安装版升级到zabbix4.0长期支持版 项目需求: .2版本不再支持,想升级成4.0的长期支持版 环境介绍: zabbix服务端是编译安装的,数据库和web在一台机器上 整 ...

  8. LeetCode_237. Delete Node in a Linked List

    237. Delete Node in a Linked List Easy Write a function to delete a node (except the tail) in a sing ...

  9. jenkins升级完后一直显示升级中

    这个时候是已经升级成功了的,刷新界面,从新登录即可

  10. 【Leetcode_easy】874. Walking Robot Simulation

    problem 874. Walking Robot Simulation solution1: 思路:1)如何表示移动的方向以及移动的位置坐标; 2)障碍物坐标如何检查;3)求解的是最大距离; cl ...