「CF858F」 Wizard's Tour
传送门
Luogu
解题思路
首先对于树的情况,我们很显然有一种贪心策略:
对于每一个节点先匹配子树,然后在还可以匹配的儿子间尽可能匹配,要是多出来一个就往上匹配。
推广到图的情况。。。
我们在图的生成树上 \(\text{DFS}\) ,即时删边,防止重复访问。
然后记录一个 \(f[x]\),表示直接与 \(x\) 节点并且还可以用来匹配的点。
那么我们直接一边 \(\text{DFS}\) ,一边匹配就好了。
最后输出答案即可。
细节注意事项
- 没什么细节,就是要仔细想一想
 
参考代码
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cctype>
#include <cmath>
#include <ctime>
#include <set>
#define rg register
#define file(x)									\
	freopen(x".in", "r", stdin);				\
	freopen(x".out", "w", stdout);
using namespace std;
template < typename T > inline void read(T& s) {
	s = 0; int f = 0; char c = getchar();
	while (!isdigit(c)) f |= (c == '-'), c = getchar();
	while (isdigit(c)) s = s * 10 + (c ^ 48), c = getchar();
	s = f ? -s : s;
}
const int _ = 200010;
const int __ = 400010;
int tot = 1, head[_], nxt[__], ver[__];
inline void Add_edge(int u, int v)
{ nxt[++tot] = head[u], head[u] = tot, ver[tot] = v; }
int n, m, vis[_] = { 1 }, f[_];
int cnt; struct node{ int x, y, z; }t[_];
inline void dfs(int u) {
	vis[u] = 1;
	for (rg int v, i = head[u]; i; i = nxt[i]) {
		v = ver[i], ver[i] = ver[i ^ 1] = 0;
		if (v != 0) {
			if (!vis[v]) dfs(v);
			if (f[v]) t[++cnt] = (node) { u, v, f[v] }, f[v] = 0;
			else if (f[u]) t[++cnt] = (node) { f[u], u, v }, f[u] = 0;
			else f[u] = v;
		}
	}
}
int main() {
	read(n), read(m);
	for (rg int u, v, i = 1; i <= m; ++i)
		read(u), read(v), Add_edge(u, v), Add_edge(v, u);
	for (rg int i = 1; i <= n; ++i) if (!vis[i]) dfs(i);
	printf("%d\n", cnt);
	for (rg int i = 1; i <= cnt; ++i)
		printf("%d %d %d\n", t[i].x, t[i].y, t[i].z);
	return 0;
}
完结撒花 \(qwq\)
「CF858F」 Wizard's Tour的更多相关文章
- 「译」JUnit 5 系列:条件测试
		
原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...
 - 「译」JUnit 5 系列:扩展模型(Extension Model)
		
原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...
 - JavaScript OOP 之「创建对象」
		
工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...
 - 「C++」理解智能指针
		
维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...
 - 「JavaScript」四种跨域方式详解
		
超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...
 - 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management
		
写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...
 - 「2014-3-18」multi-pattern string match using aho-corasick
		
我是擅(倾)长(向)把一篇文章写成杂文的.毕竟,写博客记录生活点滴,比不得发 paper,要求字斟句酌八股结构到位:风格偏杂文一点,也是没人拒稿的.这么说来,arxiv 就好比是 paper 世界的博 ...
 - 「2014-3-17」C pointer again …
		
记录一个比较基础的东东-- C 语言的指针,一直让人又爱又恨,爱它的人觉得它既灵活又强大,恨它的人觉得它太过于灵活太过于强大以至于容易将人绕晕.最早接触 C 语言,还是在刚进入大学的时候,算起来有好些 ...
 - 「2014-3-13」Javascript Engine, Java VM, Python interpreter, PyPy – a glance
		
提要: url anchor (ajax) => javascript engine (1~4 articles) => java VM vs. python interpreter =& ...
 
随机推荐
- try/catch/finally 语句
			
定义和用法 try/catch/finally 语句用于处理代码中可能出现的错误信息. 错误可能是语法错误,通常是程序员造成的编码错误或错别字.也 可能是拼写错误或语言中缺少的功能(可能由于浏览器差异 ...
 - select出来的表增加递增列
			
Select identity(int,1,1) as no,* into #tmp from table
 - TCP/IP详解,卷1:协议--第6章 ICMP:Internet控制报文协议
			
引言 I C M P经常被认为是 I P层的一个组成部分.它传递差错报文以及其他需要注意的信息. I C M P报文通常被I P层或更高层协议( T C P或U D P)使用.一些I C M P报文把 ...
 - 普及C组第四题(8.18)
			
1574. [提高]X-因子链 (File IO): input:factor.in output:factor.out 时间限制: 1000 ms 空间限制: 131072 KB 题目描述 给一个 ...
 - .net core 2.2  使用imagemagick 将pdf转化为png
			
工作需要将PDF文件每一页拆分为一个一个的png文件 测试环境:mac,visual studio for mac 2019 nuget:magick.net-Q16-AnyCPU 不能直接支持PDF ...
 - JavaScript错误-throw、try和catch
			
try 语句测试代码块的错误. catch 语句处理错误. throw 语句创建自定义错误. finally 语句在 try 和 catch 语句之后,无论是否有触发异常,该语句都会执行. JavaS ...
 - [USACO13JAN]Cow Lineup
			
Description Luogu3069 USACO Solution 由于两个点之间最多可以有\(k+1\)种牛,而牛的种数是单调的.所以可以用尺取法(区间伸缩法),每次右移右端点后,让左端点不断 ...
 - 【转载】Java集合容器全面分析
			
转自:http://blog.csdn.net/garfielder007/article/details/52143803 简介: 集合类Collection不是Java的核心类,是Java的扩展类 ...
 - python正则非贪婪模式
			
上一篇python正则匹配次数大家应该也发现了,除了?其他匹配次数规则都是尽可能多的匹配 那如果只想匹配1次怎么办呢,这就是正则中非贪婪模式的概念了 原理就是利用?与其他匹配次数规则进行组合 单个匹配 ...
 - 题解【洛谷P2619】[国家集训队2]Tree I
			
题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有\(need\)条白色边的生成树. 题目保证有解. 输入输出格式 输入格式 第一行\(V,E,need\)分别表示点数,边 ...