Gym 101257B:2Trees(DFS+思维)
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+思维)的更多相关文章
- hdu6035[dfs+思维] 2017多校1
/*hdu6035[dfs+思维] 2017多校1*/ //合并色块, 妙啊妙啊 #include<bits/stdc++.h> using namespace std; ; const ...
- D. Eternal Victory(dfs + 思维)
D. Eternal Victory time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- Gym 101128A Promotions(思维 + dfs)题解
题意:给一有向图,如果A指向B,则A是B的上级.一直i要升职那么他的上级必须都升职.现在给你一个升职人数的区间[a, b],问你升职a人时几个人必被升职,b时几个人必升职,b时几个人没有可能被升职. ...
- Gym 100463D Evil DFS
Evil Time Limit: 5 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100463/attachments Descri ...
- Codeforces Gym 100463D Evil DFS
Evil Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100463/attachments Descr ...
- Codeforces Gym101246G:Revolutionary Roads(DFS+思维)
http://codeforces.com/gym/101246/problem/G 题意:有一个n个点m条边的有向图,现在可以修改某一条有向边使得其为无向边,问修改哪些边可以使得修改后的强连通分量的 ...
- Gym 102346A Artwork dfs
Artwork Gym - 102346A 题意:给n*m的地图,入口是(0,0),出口是(n,m),其中有k个监视器,坐标是(xi,yi),监视半径是r,问一个人能不能不被监视到,从起点到终点. 如 ...
- Artwork (Gym - 102346A)【DFS、连通块】
Artwork (Gym - 102346A) 题目链接 算法 DFS,连通块 时间复杂度:O(k*n + k * k) 1.这道题就是让你判断从(0,0)到(m,n),避开中途所有的传感器(传感器的 ...
- Codeforces Gym 100650B Countdown DFS
Problem B: CountdownTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/conte ...
随机推荐
- html 自制属性
HTML5 允许扩展的(自制的)属性,以 data- 开头 <label id="id0" data-value="0">0</label&g ...
- php获取一个月前的时间戳,获取三个月前的时间戳,获取一年前的时间戳
strtotime 非常强大的一个获取时间戳的函数 php获取一个月前的时间戳: strtotime("-0 year -1 month -0 day"); php获取三个月前的时 ...
- 自定义View实现图片热区效果
我司主要从事工业物联网领域软件的开发,现有个需求,在外废品处理时需要对产品的不良位置进行标记,点选图片实现图片网格的着色功能. 需求是通过自定义view来实现,实现思路如下: 首先将点击的小方格对象实 ...
- 一个让业务开发效率提高10倍的golang库
一个让业务开发效率提高10倍的golang库 此文除了是标题党,没有什么其他问题. 这篇文章推荐一个库,https://github.com/jianfengye/collection. 这个库是我在 ...
- 【Gerrit】Performance Cheat Sheet
首先说下做这件事情的主因,组内有人说Project repo sync有点慢,废话不多说,直接上图. 相关官方文档参考链接: 我的数据: ~/review_site/logs# fgrep " ...
- iOS 监听控件某个属性的改变observeValueForKeyPath
创建一个测试的UIButton #import "ViewController.h" @interface ViewController () @property(nonatomi ...
- 使用tratto进行CISCO网络设备的管理
测试环境: CSR1000V CentOS7.4 X64 Step 1:在CentOS7上安装python 3.0环境 [root@docker ~]# python3 -VPython 3.7.0[ ...
- wpf自定义带刻度的柱状图控件
效果图: 主要代码xaml: <UserControl x:Class="INSControls._01Conning.Steer.ConningSpeedBar" xmln ...
- vista下开机启动 简单绕过UAC的方法(自己使用runas参数重新启动自己,有点意思)
背景 vista下,如果不开启UAC,那就没有我下面要说的问题了,呵呵.下面说的都是在vista开启UAC的前提下说的,win7也适用. 在vista下,系统开启了UAC,如果你的 ...
- 减少Qt编译时间暨简单Qt裁剪
本站所有文章由本站和原作者保留一切权力,仅在保留本版权信息.原文链接.原文作者的情况下允许转载,转载请勿删改原文内容, 并不得用于商业用途. 谢谢合作.原文链接:减少Qt编译时间暨简单Qt裁剪 编译一 ...