http://codeforces.com/gym/101257/problem/B

题意:给出两棵叶子数一样的树,在将叶子合并之后,对这个图进行染色,相邻的结点颜色不能相同,问最少需要染的颜色数,并输出合并叶子的方案。

思路:画了好几个图找了下规律,发现对于任意一个这样的图,最多只需要染三种颜色,最少是染两种颜色。

如果合并后的图,每一条从一棵树的根节点走到另一棵树的根节点的路径长度的奇偶性相同,那么这个时候就是只需要染两种颜色。

剩下的情况就是染三种颜色了。

对于每棵树,随便找一个不是叶子结点当做根节点往下DFS(因为无论选择哪个点,弄出来的路径长度奇偶性数量是相同的)求出每棵树路径长度为奇数的个数和为偶数的个数,然后分别记录后就可以求解了。

有两种情况染两种颜色:第一棵树的奇数 = 第二棵树的奇数,第一棵树的奇数 = 第二棵树的偶数。(少考虑了第二种情况,大概以为推论是错的)。然后按要求输出。

 #include <bits/stdc++.h>
using namespace std;
#define N 200010
#define INF 0x3f3f3f3f
const double eps = 1e-;
typedef long long LL;
struct Edge {
int v, nxt;
} edge[N*];
int head[N], tot, col[N], deg1[N], deg2[N], dis1[N], dis2[N], ans, n1, n2;
vector<int> leaf1, leaf2, d1, d2, e1, e2; void Add(int u, int v) {
edge[tot] = (Edge) {v, head[u]}; head[u] = tot++;
edge[tot] = (Edge) {u, head[v]}; head[v] = tot++;
} void dfs(int u, int fa, int *dis) {
for(int i = head[u]; ~i; i = edge[i].nxt) {
int v = edge[i].v;
if(v == fa) continue;
dis[v] = dis[u] + ;
dfs(v, u, dis);
}
}
//
int main() {
memset(head, -, sizeof(head)); tot = ;
scanf("%d", &n1);
int rt1 = -, rt2 = -;
for(int i = ; i < n1; i++) {
int u, v; scanf("%d%d", &u, &v);
Add(u, v); deg1[u]++; deg1[v]++;
}
for(int i = ; i <= n1; i++)
if(deg1[i] == ) leaf1.push_back(i); // 度为1的点叶子
else rt1 = i;
dis1[rt1] = ; // 随便挑一个当根结点然后往下DFS求出距离,因为距离的奇偶是确定的
dfs(rt1, -, dis1); memset(head, -, sizeof(head)); tot = ;
scanf("%d", &n2);
for(int i = ; i < n2; i++) {
int u, v; scanf("%d%d", &u, &v);
Add(u, v); deg2[u]++; deg2[v]++;
}
for(int i = ; i <= n2; i++)
if(deg2[i] == ) leaf2.push_back(i);
else rt2 = i;
dis2[rt2] = ;
dfs(rt2, -, dis2); int odd1, eve1, odd2, eve2;
odd1 = eve1 = odd2 = eve2 = ;
int sz = leaf1.size();
for(int i = ; i < sz; i++) { // 求两棵树分别的奇偶距离数
if(dis1[leaf1[i]] & ) odd1++, d1.push_back(leaf1[i]);
else eve1++, e1.push_back(leaf1[i]);
if(dis2[leaf2[i]] & ) odd2++, d2.push_back(leaf2[i]);
else eve2++, e2.push_back(leaf2[i]);
}
if(odd1 == odd2) { // 如果第一棵树的奇数距离和第二棵树的奇数(或偶数)距离相等,那么可以只涂两种颜色
puts("");
for(int i = ; i < odd1; i++)
printf("%d %d\n", d1[i], d2[i]);
for(int i = ; i < eve1; i++)
printf("%d %d\n", e1[i], e2[i]);
} else if(odd1 == eve2) {
puts("");
for(int i = ; i < odd1; i++)
printf("%d %d\n", d1[i], e2[i]);
for(int i = ; i < eve1; i++)
printf("%d %d\n", e1[i], d2[i]);
} else { // 否则最多只需要三种,可以随便输出
int a1 = , b1 = , a2 = , b2 = ;
puts("");
for(int i = ; i < sz; i++) {
if(a1 == odd1) printf("%d ", e1[b1++]);
else printf("%d ", d1[a1++]);
if(a2 == odd2) printf("%d\n", e2[b2++]);
else printf("%d\n", d2[a2++]);
}
}
return ;
}

Gym 101257B:2Trees(DFS+思维)的更多相关文章

  1. hdu6035[dfs+思维] 2017多校1

    /*hdu6035[dfs+思维] 2017多校1*/ //合并色块, 妙啊妙啊 #include<bits/stdc++.h> using namespace std; ; const ...

  2. D. Eternal Victory(dfs + 思维)

    D. Eternal Victory time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  3. Gym 101128A Promotions(思维 + dfs)题解

    题意:给一有向图,如果A指向B,则A是B的上级.一直i要升职那么他的上级必须都升职.现在给你一个升职人数的区间[a, b],问你升职a人时几个人必被升职,b时几个人必升职,b时几个人没有可能被升职. ...

  4. Gym 100463D Evil DFS

    Evil Time Limit: 5 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100463/attachments Descri ...

  5. Codeforces Gym 100463D Evil DFS

    Evil Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100463/attachments Descr ...

  6. Codeforces Gym101246G:Revolutionary Roads(DFS+思维)

    http://codeforces.com/gym/101246/problem/G 题意:有一个n个点m条边的有向图,现在可以修改某一条有向边使得其为无向边,问修改哪些边可以使得修改后的强连通分量的 ...

  7. Gym 102346A Artwork dfs

    Artwork Gym - 102346A 题意:给n*m的地图,入口是(0,0),出口是(n,m),其中有k个监视器,坐标是(xi,yi),监视半径是r,问一个人能不能不被监视到,从起点到终点. 如 ...

  8. Artwork (Gym - 102346A)【DFS、连通块】

    Artwork (Gym - 102346A) 题目链接 算法 DFS,连通块 时间复杂度:O(k*n + k * k) 1.这道题就是让你判断从(0,0)到(m,n),避开中途所有的传感器(传感器的 ...

  9. Codeforces Gym 100650B Countdown DFS

    Problem B: CountdownTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/conte ...

随机推荐

  1. ESB (Enterprise Service Bus) 入门

    在本文中,ESB相关技术概念和术语.其他需要了解的入门的基础知识,并介绍了一些初步的了解ESB产品.因为它是一个新的ESB.将自己的学习内容与过程,记录下来! 愿在这里与大家分享一下,共同进步与提高! ...

  2. php如何去掉二维数组中重复的元素

    $arr=array( "1"=>array("a","b "), "2"=>array("a&q ...

  3. Win8 Metro(C#)数字图像处理--2.75灰度图像的形态学算法

    原文:Win8 Metro(C#)数字图像处理--2.75灰度图像的形态学算法 前面章节中介绍了二值图像的形态学算法,这里讲一下灰度图的形态学算法,主要是公式,代码略. 1,膨胀算法 2,腐蚀算法 3 ...

  4. Python标准库(3.x): itertools库扫盲

    itertools functions accumulate() compress() groupby() starmap() chain() count() islice() takewhile() ...

  5. Win10《芒果TV》更新v3.8.40青春版:优化推送策略、新增缓存清理

    芒果TV暑期重磅活动-青春芒果节拉开帷幕,炫酷的3D视觉大秀.王牌IP互动体验馆.众星云集的青春炙燥夜晚会.神秘的芒果吉祥物发布,Win10版<芒果TV>全平台同步更新青春版v3.8.40 ...

  6. Python杂谈: __init__.py的作用

    我们经常在python的模块目录中会看到 "__init__.py"  这个文件,那么它到底有什么作用呢? 1. 标识该目录是一个python的模块包(module package ...

  7. 赵伟国:陆资无法进入台湾紫光要到WTO控告(芯片是为了经济安全,高通找的人不是很聪明)

    集微网消息,昨天由全球半导体联盟和上海市集成电路行业协会联合举办的Memory +论坛在上海举行,会议透过来自存储器.逻辑和系统市场领先企业的高管,深入他们对未来存储器的应用.可行的商业模式,以及逻辑 ...

  8. 两种加载dll的方式

    通过链接lib文件加载dll的话,使用过程中没法动态切换 通过loadlibrary函数动态加载的话,可以动态切换

  9. Mysql下载(on windows-noinstall zip archive)

    所有内容,都是针对Mysql5.7.18介绍. 1.首先你需要下载一个完整的包,Mysql目前有两个版本可以使用: a. MySql Enterprise Edition:企业版 b. MySql C ...

  10. ASP.NET MVC控制器Controller

    控制器的定义 MVC模式下的控制器(Controller)主要负责响应用户的输入,并且在响应时可能的修改模型(Model). 之前的URL访问,通常是通过指定服务器的路径来实现,如访问URL:http ...