传送门

Luogu

解题思路

显然对于两棵树共有的边,我们不会动它。

考虑第二颗树中有和第一棵树不同的边怎么处理。

我们设 \(fa_1[u],fa_2[u]\) 分别代表 \(u\) 在两棵树中的父亲。

很显然的想法就是对于第一棵树中的边 \(fa_1[u] \rightarrow u\) 没有出现在第二棵树上,那就把这条边换成 \(fa_2[u] \rightarrow u\)

但是我们会发现有可能 \(fa_2[u] \rightarrow u\) 已经被连上了。

那么我们就尝试跳 \(fa_2[u]\) 的父亲知直到可以连边,这个过程可以用一个并查集来搞(预处理出每个点会连向哪个点)。

并且在dfs的过程中先处理子树信息,可以保证不会连出环。

细节注意事项

  • 咕咕咕

参考代码

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cctype>
#include <cmath>
#include <ctime>
#include <vector>
#define rg register
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 _ = 500000 + 10; int n, ff[2][_], fa[_];
vector < int > G[2][_];
struct node{ int a, b, c, d; };
vector < node > ans; inline int findd(int x) { return fa[x] == x ? x : findd(fa[x]); } inline void dfs(int x, int u, int f) {
for (rg int v : G[x][u]) {
if (v == f) continue;
ff[x][v] = u, dfs(x, v, u);
}
} inline void dfss(int u, int f) {
for (rg int v : G[0][u]) {
if (v == f) continue; dfss(v, u);
if (u != ff[1][v] && v != ff[1][u])
ans.push_back((node) { v, u, findd(v), ff[1][findd(v)] });
}
} int main() {
#ifndef ONLINE_JUDGE
freopen("in.in", "r", stdin);
#endif
read(n);
for (rg int u, v, i = 1; i < n; ++i) read(u), read(v), G[0][u].push_back(v), G[0][v].push_back(u);
for (rg int u, v, i = 1; i < n; ++i) read(u), read(v), G[1][u].push_back(v), G[1][v].push_back(u);
dfs(0, 1, 0);
dfs(1, 1, 0);
for (rg int i = 2; i <= n; ++i) {
int u = ff[1][i];
if (u == ff[0][i] || i == ff[0][u])
fa[i] = u;
else
fa[i] = i;
}
dfss(1, 0);
printf("%d\n", (int) ans.size());
for (rg node x : ans) printf("%d %d %d %d\n", x.a, x.b, x.c, x.d);
return 0;
}

完结撒花 \(qwq\)

「CF650E」Clockwork Bomb的更多相关文章

  1. 「译」JUnit 5 系列:条件测试

    原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...

  2. 「译」JUnit 5 系列:扩展模型(Extension Model)

    原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...

  3. JavaScript OOP 之「创建对象」

    工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...

  4. 「C++」理解智能指针

    维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...

  5. 「JavaScript」四种跨域方式详解

    超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...

  6. 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management

    写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...

  7. 「2014-3-18」multi-pattern string match using aho-corasick

    我是擅(倾)长(向)把一篇文章写成杂文的.毕竟,写博客记录生活点滴,比不得发 paper,要求字斟句酌八股结构到位:风格偏杂文一点,也是没人拒稿的.这么说来,arxiv 就好比是 paper 世界的博 ...

  8. 「2014-3-17」C pointer again …

    记录一个比较基础的东东-- C 语言的指针,一直让人又爱又恨,爱它的人觉得它既灵活又强大,恨它的人觉得它太过于灵活太过于强大以至于容易将人绕晕.最早接触 C 语言,还是在刚进入大学的时候,算起来有好些 ...

  9. 「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 =& ...

随机推荐

  1. elasticsearch ik解析器

    ik解析器 1.      ik解析器 The IK Analysis plugin integrates Lucene IK analyzer (http://code.google.com/p/i ...

  2. mongodb副本集仲裁节点搭建

    服务器准备: 主节点192.168.100.106 从节点192.168.100.107 仲裁节点192.168.100.108 三台服务器: 关闭防火墙 service iptables stop ...

  3. idea中springboot静态资源及页面跳转问题

    1,静态资源放在resources/static下,html页面放在resources/templates下 2,在html中引入静态资源时,不用带static(对于路径来说是透明的) 3, 配置ht ...

  4. Educational Codeforces Round 82 B. National Project

    Your company was appointed to lay new asphalt on the highway of length nn. You know that every day y ...

  5. Jquery 动态交换两个div位置并添加Css动画效果

    前端网页开发中我们经常会遇到需要动态置换两个DIV元素的位置,常见的思路大多是不考虑原始位置,直接采用append或者appendTo方式将两元素进行添加,该法未考虑原始位置,仅会添加为元素的最后一子 ...

  6. [ DLPytorch ] 文本分类&图像增强

    图像增强 图像增广(image augmentation)技术通过对训练图像做一系列随机改变,来产生相似但又不同的训练样本,从而扩大训练数据集的规模.图像增广的另一种解释是,随机改变训练样本可以降低模 ...

  7. Mysql按照字段的重复数排序

    select source_job_number,count(*) as count from v1_user WHERE source_id=3 group by source_job_number ...

  8. np.ndarray与PIL.Image对象相互转换

    Image对象有crop功能,也就是图像切割功能,但是使用opencv读取图像的时候,图像转换为了np.adarray类型,该类型无法使用crop功能,需要进行类型转换,所以使用下面的转换方式进行转换 ...

  9. ImageMagick PDF到JPG有时会导致黑色背景

    convert -verbose -density 300 -quality 50 -background white -alpha remove 0.pdf 0.jpg magick convert ...

  10. DVWA靶机--简单的文件上传漏洞

    简单的文件上传漏洞(靶机安全级别:low) 事先准备好一句话木马,密码为pass 上传一句话木马,显示上传路径(一般网站是不会显示路径的,这里靶机为了方便你测试漏洞,直接显示出了路径: ../../h ...