B. 2Trees
time limit per test

0.75 seconds

memory limit per test

256 megabytes

input

standard input

output

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.

Input

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.

Output

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.

Examples
Input
3
1 2
1 3
3
3 1
2 3
Output
2
2 1
3 2
Input
4
1 2
2 3
3 4
3
3 1
1 2
Output
3
4 2
1 3
Note
  • 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(深搜)(想法)的更多相关文章

  1. 2017 Hackatari Codeathon C. Arcade(DP)(滚动数组)

    C. Arcade time limit per test 1 second memory limit per test 256 megabytes input standard input outp ...

  2. ACM 海贼王之伟大航路(深搜剪枝)

    "我是要成为海贼王的男人!" 路飞他们伟大航路行程的起点是罗格镇,终点是拉夫德鲁(那里藏匿着"唯一的大秘宝"--ONE PIECE).而航程中间,则是各式各样的 ...

  3. Poj(2488),按照字典序深搜

    题目链接:http://poj.org/problem?id=2488 思路:按照一定的字典序深搜,当时我的想法是把所有的可行的路径都找出来,然后字典序排序. 后来,凡哥说可以在搜索路径的时候就按照字 ...

  4. [vijos1159&洛谷1494]岳麓山上打水<迭代深搜>

    题目链接:https://vijos.org/p/1159 https://www.luogu.org/problem/show?pid=1494 这是今天的第三道迭代深搜的题,虽然都是迭代深搜的模板 ...

  5. HDU--杭电--1195--Open the Lock--深搜--都用双向广搜,弱爆了,看题了没?语文没过关吧?暴力深搜难道我会害羞?

    这个题我看了,都是推荐的神马双向广搜,难道这个深搜你们都木有发现?还是特意留个机会给我装逼? Open the Lock Time Limit: 2000/1000 MS (Java/Others)  ...

  6. 利用深搜和宽搜两种算法解决TreeView控件加载文件的问题。

    利用TreeView控件加载文件,必须遍历处所有的文件和文件夹. 深搜算法用到了递归. using System; using System.Collections.Generic; using Sy ...

  7. 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 ...

  8. 2016弱校联盟十一专场10.2---Around the World(深搜+组合数、逆元)

    题目链接 https://acm.bnu.edu.cn/v3/problem_show.php?pid=52305 problem  description In ICPCCamp, there ar ...

  9. 2015暑假多校联合---Cake(深搜)

    题目链接:HDU 5355 http://acm.split.hdu.edu.cn/showproblem.php?pid=5355 Problem Description There are m s ...

随机推荐

  1. Freemarker <#list List/Map/Array[] as Object>

    http://blog.csdn.net/ani521smile/article/details/52164366 详细教程链接

  2. 省队集训 Day3 吴清华

    [题目大意] 给网格图,共有$n * n$个关键节点,横向.纵向距离均为$d$,那么网格总长度和宽度均为$(n+1) * d + 1$,最外围一圈除了四角是终止节点.要求每个关键节点都要通过线连向终止 ...

  3. 【vijos】P1066 弱弱的战壕

    [算法]线段树 [题解]将所有坐标按x(第一)和y(第二)从小到大排序,再按顺序插入线段树,即在线段树中将y坐标位置+1,这样就能保证每个坐标能包含的点一定先被处理了,每次询问查询1...a[i].y ...

  4. 【BZOJ】1607: [Usaco2008 Dec]Patting Heads 轻拍牛头

    [算法]模拟 #include<cstdio> #include<algorithm> using namespace std; ,maxm=; int a[maxn],A[m ...

  5. 基本控件文档-UISwitch属性---iOS-Apple苹果官方文档翻译

    本系列所有开发文档翻译链接地址:iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址 //转载请注明出处--本文永久链接:http://www.cnblogs.com/Ch ...

  6. Spring总结以及在面试中的一些问题(山东数漫江湖)

    1.谈谈你对spring IOC和DI的理解,它们有什么区别? IoC Inverse of Control 反转控制的概念,就是将原本在程序中手动创建UserService对象的控制权,交由Spri ...

  7. Html5_sessionStrong和localStorage的灵活使用

    谈谈这两个属性sessionStrong和localStorage是Html5新增点属性,用来记录一些数据在浏览器. 两者的区别sessionStrong存储的数据是暂时的,浏览器关掉后,存储下来的数 ...

  8. 广度优先算法(BFS)与深度优先算法(DFS)

    一.广度优先算法BFS(Breadth First Search) 基本实现思想 (1)顶点v入队列. (2)当队列非空时则继续执行,否则算法结束. (3)出队列取得队头顶点v: (4)查找顶点v的所 ...

  9. linux 3389连接工具Rdesktop

    简单使用 工作机换成战斗机了,改用ubuntu,原来的windows7上东西笔记多,还不想重装.用rdesktop来远程连接windows: sudo apt-get install rdesktop ...

  10. Linking code for an enhanced application binary interface (ABI) with decode time instruction optimization

    A code sequence made up multiple instructions and specifying an offset from a base address is identi ...