【AGC014E】Blue and Red Tree
时间:2019-09-20
本文章向大家介绍【AGC014E】Blue and Red Tree,主要包括【AGC014E】Blue and Red Tree使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
正着考虑把边割断感觉非常难以考虑,于是考虑一下将整个过程倒过来,也就是把红边树变成蓝边树
不难发现最后一步我们割断的边肯定是两棵树上都有的边,毕竟最后一步的时候原树只剩下了一条边
如果两棵树没有公共边,那么直接输出\(\text{NO}\)即可
再来考虑一下\(n-2\)步是怎么操作的
不难发现我们可能是继续操作一条公共边,把这条蓝边变成红边;或者是选择两个不能通过蓝边相连的点但是两点的路径上只有一条边不是蓝边的点,之后把这条蓝边给连上
这个不能通过蓝边相连但是两点路径上只有一条红边的条边看起来非常难以表示,但是我们考虑把形成的蓝边联通块缩在一起,发现这个条件就变成了这两个点之间有一条红边相连。当然这条红边也必须得是目标红边树里的边。
于是现在做法很明确了,就是找到两棵树的公共边,将公共边缩成一个点。继续进行这个过程,知道最后整棵树能缩成一个点,答案就是\(\text{YES}\);否则就是\(\text{NO}\)
我们用并查集维护一下联通块的情况,启发式合并边集即可
代码
#include<bits/stdc++.h>
#define re register
#define LL long long
#define mp std::make_pair
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#pragma GCC optimize(3)
#pragma GCC optimize("-fcse-skip-blocks")
inline int read() {
char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
const int maxn=1e5+5;
std::set<int> e[2][maxn];
std::set<int>::iterator it;
typedef std::pair<int,int> pii;
std::map<pii,int> ma[2];
int n,tot,fa[maxn];
pii q[maxn];
inline int find(int x) {return fa[x]==x?x:fa[x]=find(fa[x]);}
inline pii get(int x,int y) {if(x<y) std::swap(x,y);return mp(x,y);}
inline void merge(int x,int y) {
x=find(x),y=find(y);
if(x==y) return;
if(e[0][x].size()+e[1][x].size()<e[0][y].size()+e[1][y].size())
std::swap(x,y);
e[0][y].erase(x);e[0][x].erase(y);
for(it=e[0][y].begin();it!=e[0][y].end();++it) {
int now=(*it);
ma[0][get(now,y)]=0;ma[0][get(x,now)]=1;
if(ma[1][get(x,now)]) q[++tot]=mp(x,now);
e[0][x].insert(now);e[0][now].erase(y);e[0][now].insert(x);
}
e[1][y].erase(x);e[1][x].erase(y);
for(it=e[1][y].begin();it!=e[1][y].end();++it) {
int now=(*it);
ma[1][get(y,now)]=0;ma[1][get(x,now)]=1;
if(ma[0][get(x,now)]) q[++tot]=mp(x,now);
e[1][x].insert(now);e[1][now].erase(y);e[1][now].insert(x);
}
fa[y]=x;
}
int main() {
n=read();
for(re int i=1;i<=n;i++) fa[i]=i;
for(re int x,y,i=1;i<n;i++) {
x=read(),y=read();
e[0][x].insert(y),e[0][y].insert(x);
if(x<y) std::swap(x,y);
ma[0][mp(x,y)]++;
}
for(re int x,y,i=1;i<n;i++) {
x=read(),y=read();
e[1][x].insert(y),e[1][y].insert(x);
if(x<y) std::swap(x,y);
if(ma[0][mp(x,y)]) q[++tot]=mp(x,y);
ma[1][mp(x,y)]++;
}
for(re int i=1;i<=tot;i++) merge(q[i].first,q[i].second);
for(re int i=1;i<=n;i++) fa[i]=find(i);
for(re int i=2;i<=n;i++) if(fa[1]!=fa[i]) {puts("NO");return 0;}
puts("YES");return 0;
return 0;
}
原文地址:https://www.cnblogs.com/asuldb/p/11557271.html
- Javascript缓存投毒学习与实战
- 【Java学习笔记之十】Java中循环语句foreach使用总结及foreach写法失效的问题
- Codeforces 839B Game of the Rows【贪心】
- Codeforces 839A Arya and Bran【暴力】
- 【Java学习笔记之十一】Java中常用的8大排序算法详解总结
- 浅谈zip格式处理逻辑漏洞
- C/C++中peek函数的原理及应用
- 洛谷 P1200 [USACO1.1]你的飞碟在这儿Your Ride Is He…【字符串+模拟】
- 洛谷 P1055 ISBN号码【字符串+模拟】
- 【Java学习笔记之十二】Java8增强的工具类:Arrays的用法整理总结
- 利用insert,update和delete注入获取数据
- 【机器学习笔记之二】决策树的python实现
- 【Java学习笔记之十三】初探Java面向对象的过程及代码实现
- 洛谷 P1308 统计单词数【字符串+模拟】
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 记一次Fcitx5的安装
- 解决KDE下KDE Wallet重装系统后每次登陆需要输入密码
- KDE下完美的Unity桌面体验,扔掉active window control
- C++核心准则T.5:结合使用泛型和面向对象技术应该增强它们的效果而不是成本
- C++核心准则T.10:为所有的模板参数定义概念
- C语言二级指针用法之模拟句柄用途
- Linux解压缩文件
- C++核心准则T.11:只要可能就使用标准概念
- 给pugjs的stun主题添加canvas时钟
- C++核心准则T.12:声明局部变量类型时,概念比auto更好
- Arch Linux切换rEFInd开机引导程序
- C++核心准则T.13:对于简单的,单类型参数概念,使用缩略记法更好
- VBA编写Ribbon Custom UI编辑器08——实现ZIP的写入
- 用 Python 写个七夕表白神器
- 3分钟短文 | Laravel 用户授权原来内置了这么多方法