2017 Hackatari Codeathon B. 2Trees(深搜)(想法)
0.75 seconds
256 megabytes
standard input
standard output
You are given two trees with the same number of leaves L, your task is to merge the two trees' leaves in a way that ensures the following:
- The number of colors needed to color the resulting graph such that no two adjacent nodes share the same color is minimum.
- Each leaf in the first tree is merged into exactly one leaf from the second tree.
- Each leaf in the second tree is merged into exactly one leaf from the first tree.
- Nodes other than leaves are not merged.
Note that by merging two leaves a and b, the resulting node will have both edges of a and b.
The first line of input contains one integer N (3 ≤ N ≤ 105), the number of nodes in the first tree.
Then follows N - 1 lines, the ith line contains two integers u and v (1 ≤ u, v ≤ N), the indices of the nodes connected by the ith edge in the first tree.
The next line contains an integer M (3 ≤ M ≤ 105), the number of nodes in the second tree.
Then follows M - 1 lines, the ith line contains two integers u and v (1 ≤ u, v ≤ M), the indices of the nodes connected by the ith edge in the second tree.
It is guaranteed that the two trees will have the same number of leaves L.
On a single line print the number of colors needed to color the resulting graph.
Followed by L lines, the ith line of them contains two integers u and v (1 ≤ u ≤ N)(1 ≤ v ≤ M), the indices of the leaves to be merged, where u is a leaf in the first tree, and v is a leaf in the second tree.
If there’s more than one possible solution, print any of them.
3
1 2
1 3
3
3 1
2 3
2
2 1
3 2
4
1 2
2 3
3 4
3
3 1
1 2
3
4 2
1 3
- A tree of N nodes is a connected undirected graph with N - 1 edges.
- A node is a leaf if and only if it is connected to at most one other node.
In the first sample, the two trees can be illustrated as follows:

After merging node 2 from first tree with node 1 from the second tree, and node 3 from the first tree with node 2 from the second tree, the resulting graph is illustrated in the figure below:

The minimum number of colors required to satisfy the problem constraints is 2.
【分析】给你两棵树,他们的叶子节点个数都为L,现在要将两棵树合并,方法是只合并叶子结点,即一一对应,合并后两个叶子结点就成了一个节点,两棵树即成了
一个有环图。然后给节点染色,相邻节点染不同颜色,问如何合并使得颜色数最少。
首先得想到一点,对于任何一个节点,他是可以与对面任一节点合并的。那么我们考虑一个合并后的一条支路(两个叶子结点合并后形成的),由第一棵树的根节点指向
叶子结点u,再指向第二颗树的叶子结点,到根。root1-->u-->v-->root2,假设合并前u的深度为x,v的深度为y,则合并后支路的长度为L=x+y-1;
若L为奇数,则我们可以选择两种颜色,分别染1,2,1,...2,1。
若L为偶数,则我们可以选择两种颜色,分别染1,2,1,...2。
也就是说,这个图,我们从root1-->root2染色,如果只用1,2染色,那么所有支路的长度必须同为奇或同为偶。而这个奇偶又是由合并前叶子的深度决定的,所以先DFS
算深度,然后再if-else匹配。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <climits>
#include <cstring>
#include <string>
#include <set>
#include <bitset>
#include <map>
#include <queue>
#include <stack>
#include <vector>
#define rep(i,m,n) for(i=m;i<=n;i++)
#define mod 1000000007
#define inf 0x3f3f3f3f
#define vi vector<int>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define ll long long
#define pi acos(-1.0)
#define pii pair<int,int>
#define sys system("pause")
const int maxn=1e5+;
const int N=2e5+;
using namespace std;
ll gcd(ll p,ll q){return q==?p:gcd(q,p%q);}
ll qpow(ll p,ll q){ll f=;while(q){if(q&)f=f*p%mod;p=p*p%mod;q>>=;}return f;}
int n,m,k,tot=;
int cnt[N],dep1[N],dep2[N];
int a[N];
int d[][]={,,,,-,,,-};
vector<int>edg1[N],edg2[N],v1,v2;
queue<int>odd1,even1,odd2,even2;
void dfs1(int u,int fa){
dep1[u]=dep1[fa]+;
if(edg1[u].size()==){
if(dep1[u]&)odd1.push(u);
else even1.push(u);
return;
}
for(int i=;i<edg1[u].size();i++){
int v=edg1[u][i];
if(v!=fa)dfs1(v,u);
}
}
void dfs2(int u,int fa){
dep2[u]=dep2[fa]+;
if(edg2[u].size()==){
if(dep2[u]&)odd2.push(u);
else even2.push(u);
return;
}
for(int i=;i<edg2[u].size();i++){
int v=edg2[u][i];
if(v!=fa)dfs2(v,u);
}
}
int main()
{
int x,y,ans=,sum=;
scanf("%d",&n);
for(int i=;i<n;i++){
scanf("%d%d",&x,&y);
edg1[x].pb(y);
edg1[y].pb(x);
}
for(int i=;i<=n;i++){
if(edg1[i].size()>){
dfs1(i,);
break;
}
}
scanf("%d",&m);
for(int i=;i<m;i++){
scanf("%d%d",&x,&y);
edg2[x].pb(y);
edg2[y].pb(x);
}
for(int i=;i<=m;i++){
if(edg2[i].size()>){
dfs2(i,);
break;
}
}
if(odd1.size()!=odd2.size()&&odd1.size()!=even2.size()){
puts("");
for(int i=;i<=n;i++){
if(edg1[i].size()==)v1.push_back(i);
}
for(int i=;i<=m;i++){
if(edg2[i].size()==)v2.push_back(i);
}
for(int i=;i<v1.size();i++){
printf("%d %d\n",v1[i],v2[i]);
}
}
else if(odd1.size()==even2.size()){
puts("");
while(!odd1.empty()){
int od1=odd1.front();odd1.pop();
int ev2=even2.front();even2.pop();
printf("%d %d\n",od1,ev2);
}
while(!even1.empty()){
int od2=odd2.front();odd2.pop();
int ev1=even1.front();even1.pop();
printf("%d %d\n",ev1,od2);
}
}
else if(odd1.size()==odd2.size()){
puts("");
while(!odd1.empty()){
int od1=odd1.front();odd1.pop();
int od2=odd2.front();odd2.pop();
printf("%d %d\n",od1,od2);
}
while(!even1.empty()){
int ev1=even1.front();even1.pop();
int ev2=even2.front();even2.pop();
printf("%d %d\n",ev1,ev2);
}
}
return ;
2017 Hackatari Codeathon B. 2Trees(深搜)(想法)的更多相关文章
- 2017 Hackatari Codeathon C. Arcade(DP)(滚动数组)
C. Arcade time limit per test 1 second memory limit per test 256 megabytes input standard input outp ...
- ACM 海贼王之伟大航路(深搜剪枝)
"我是要成为海贼王的男人!" 路飞他们伟大航路行程的起点是罗格镇,终点是拉夫德鲁(那里藏匿着"唯一的大秘宝"--ONE PIECE).而航程中间,则是各式各样的 ...
- Poj(2488),按照字典序深搜
题目链接:http://poj.org/problem?id=2488 思路:按照一定的字典序深搜,当时我的想法是把所有的可行的路径都找出来,然后字典序排序. 后来,凡哥说可以在搜索路径的时候就按照字 ...
- [vijos1159&洛谷1494]岳麓山上打水<迭代深搜>
题目链接:https://vijos.org/p/1159 https://www.luogu.org/problem/show?pid=1494 这是今天的第三道迭代深搜的题,虽然都是迭代深搜的模板 ...
- HDU--杭电--1195--Open the Lock--深搜--都用双向广搜,弱爆了,看题了没?语文没过关吧?暴力深搜难道我会害羞?
这个题我看了,都是推荐的神马双向广搜,难道这个深搜你们都木有发现?还是特意留个机会给我装逼? Open the Lock Time Limit: 2000/1000 MS (Java/Others) ...
- 利用深搜和宽搜两种算法解决TreeView控件加载文件的问题。
利用TreeView控件加载文件,必须遍历处所有的文件和文件夹. 深搜算法用到了递归. using System; using System.Collections.Generic; using Sy ...
- 2016弱校联盟十一专场10.3---Similarity of Subtrees(深搜+hash、映射)
题目链接 https://acm.bnu.edu.cn/v3/problem_show.php?pid=52310 problem description Define the depth of a ...
- 2016弱校联盟十一专场10.2---Around the World(深搜+组合数、逆元)
题目链接 https://acm.bnu.edu.cn/v3/problem_show.php?pid=52305 problem description In ICPCCamp, there ar ...
- 2015暑假多校联合---Cake(深搜)
题目链接:HDU 5355 http://acm.split.hdu.edu.cn/showproblem.php?pid=5355 Problem Description There are m s ...
随机推荐
- vijos 1071 01背包+输出路径
描述 过年的时候,大人们最喜欢的活动,就是打牌了.xiaomengxian不会打牌,只好坐在一边看着. 这天,正当一群人打牌打得起劲的时候,突然有人喊道:“这副牌少了几张!”众人一数,果然是少了.于是 ...
- Linux中 设置apache,mysql 开机启动
linux开启启动的程序一般放在/etc/rc.d/init.d/里面,/etc/init.d/是其软连接 mysql设为linux服务 cp /usr/local/mysql5/share/mysq ...
- bootstrap框架的搭建
bootstrap框架 Bootstrap,来自 Twitter,是目前最受欢迎的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的,它简洁灵活,使得 Web 开发更加快 ...
- Angular2.0 基础: 环境搭建
最近在学习Angular2的使用,其实看过Angular2 文档的都知道,相比于之前的Angular1,Angular2 的改动还是挺大的. 而对于‘angular2 的本地开发环境的搭建的中,我们首 ...
- ubuntu下调整cpu频率
环境:ubuntu15.10 查看内核支持的cpu策略 cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors 比如我 ...
- C++学习之路(三):volatile关键字
volatile是c++中的一个关键字.用volatile修饰的变量,具有三个性质:易变性 (一)易变性: 由于编译器对代码执行的优化,两条赋值语句,下一条语句可能会直接从上一条语句使用的寄存器中取得 ...
- python爬虫模块之URL管理器模块
URL管理器模块 一般是用来维护爬取的url和未爬取的url已经新添加的url的,如果队列中已经存在了当前爬取的url了就不需要再重复爬取了,另外防止造成一个死循环.举个例子 我爬www.baidu. ...
- 【uva11613】生产销售规划
这很像之前做的一道noip模拟题…… 所以当时那题也可以用费用流写(雾) 拆点,将每个月拆成两个点,一个向起点连边表示产量,另一个点连汇点表示销量. 然后每个点依次往后面的点2连边,表示保存. #in ...
- C后端设计开发 - 第5章-内功-数据结构下卷
正文 第5章-内功-数据结构下卷 后记 如果有错误, 欢迎指正. 有好的补充, 和疑问欢迎交流, 一块提高. 在此谢谢大家了.
- 如何用jQuery获得radio的值
如何获得radio的值,在网上查了一下,下面总结几种解决方法,. 1.获取选中值: $('input:radio:checked').val(): $("input[type='radio' ...