题目链接

题意:给定一棵n个结点的树,问:对于每个结点,能否通过删除一条边并添加一条边使得仍是树,并且删除该结点后得到的各个连通分量结点数 <= n/2?

题解:树形dp,两遍dfs,第一遍dfs求得以各个结点为根的子树的结点数,以及各个结点下面切掉某条边后最多可切出多少个结点;

第二遍dfs求得每个结点上面切掉某条边后最多可切出多少个结点。

 #include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second
typedef long long ll;
const int N = 4e5+;
vector<int> ve[N];
int num[N], maxson[N], down[N], up[N];
int n;
void gmax(int& a, int b){ if(a < b) a = b;}
void dfs(int x, int fa){
// printf("dfs x %d, fa %d\n", x, fa);
num[x] = ;
down[x] = maxson[x] = ;
for(int i = ; i < ve[x].size(); i++){
int y = ve[x][i];
if(y == fa) continue ;
dfs(y, x);
num[x] += num[y];
gmax(down[x], num[y] <= n/? num[y]: down[y]);
gmax(maxson[x], num[y]);
}
}
multiset<int>::iterator it;
void dfs2(int x, int fa){
// printf("dfs2 x %d, fa %d\n", x, fa);
multiset<int> se;
for(int i = ; i < ve[x].size(); i++){
int y = ve[x][i];
if(y != fa) se.insert( num[y] <= n/? num[y]:down[y] );
} for(int i = ; i < ve[x].size(); i++){
int y = ve[x][i];
if(y != fa){
if(n-num[y] <= n/)
up[y] = n-num[y];
else {
it = se.find( num[y] <= n/? num[y]:down[y] );
se.erase(it);
gmax(up[y], up[x]);
if(!se.empty())
gmax(up[y], *se.rbegin());
se.insert( num[y] <= n/? num[y]:down[y] );
}
dfs2(y, x);
}
}
} int main(){
int u, v; scanf("%d", &n);
for(int i = ; i < n; i++){
scanf("%d%d", &u, &v);
ve[u].push_back(v), ve[v].push_back(u);
}
dfs(, -);
dfs2(, -);
bool tag;
// for(int i = 1; i <= n; i++)
// cout << maxson[i] << ' ' << num[i] << ' ' << down[i] << ' ' << up[i] << endl;
for(int i = ; i <= n; i++){
if(maxson[i] <= n/&&n-num[i] <= n/)//不用切
tag = true;
else if(n-num[i] > n/)//要切上面
tag = n-num[i]-up[i] <= n/;
else//要切下面
tag = maxson[i]-down[i] <= n/;
putchar(tag+'');
putchar(i == n? '\n':' ');
}
return ;
}

Codeforces708C Centroids 【树形dp】的更多相关文章

  1. codeforces 709E E. Centroids(树形dp)

    题目链接: E. Centroids time limit per test 4 seconds memory limit per test 512 megabytes input standard ...

  2. Codeforces 709E. Centroids 树形DP

    题目链接:http://codeforces.com/contest/709/problem/E 题意: 给你一棵树,你可以任删一条边和加一条边,只要使得其仍然是一棵树,输出每个点是否都能成为重心 题 ...

  3. CF708C Centroids(树形DP)

    发现变重心就是往重心上割,所以\(\text{up and down}\),一遍统计子树最大\(size\),一遍最优割子树,\(down\),\(up\)出信息,最后\(DFS\)出可行解 #inc ...

  4. Codeforces-708C(树形DP)

    一.题意 给定一颗树,对于每一个节点,判断能否在树中删除某一条边,然后在任意两个节点之间加一条边,使这个点成为重心. 注:删除树中某一条边后,标程并不会这么无聊地把这棵树变成两个孤立的连通图,而是再让 ...

  5. AIM Tech Round 3 (Div. 1) (构造,树形dp,费用流,概率dp)

    B. Recover the String 大意: 求构造01字符串使得子序列00,01,10,11的个数恰好为$a_{00},a_{01},a_{10},a_{11}$ 挺简单的构造, 注意到可以通 ...

  6. poj3417 LCA + 树形dp

    Network Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4478   Accepted: 1292 Descripti ...

  7. COGS 2532. [HZOI 2016]树之美 树形dp

    可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...

  8. 【BZOJ-4726】Sabota? 树形DP

    4726: [POI2017]Sabota? Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 128  Solved ...

  9. 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)

    题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...

随机推荐

  1. 怎么使用 Laravel 的服务容器来优化读写数据库中的 options关键词

    其中我们可以最方便地利用的一个特性就是 Laravel 的服务容器了.在这里我不多赘述 Service Container 是个啥,想了解的可以自行搜索.不想了解的就只要大致知道它是个可以 绑定/取出 ...

  2. IOS5基础教程之一-----如何创建XCode项目

    一.IOS的基础知识 1.只有一个应用程序正在运行.在IOS上,每一段时间内只能激活一个应用程序并在屏幕上显示. 2.只有一个窗口.只允许应用程序操作的一个窗口. 3.访问受限.只能在IOS为应用程序 ...

  3. html+css复习之第2篇 | javascript

    1. java 中定义数组和对象: 数组(Array)字面量 定义一个数组: [40, 100, 1, 5, 25, 10] 对象(Object)字面量 定义一个对象: {firstName:&quo ...

  4. northwind数据库介绍

    ① Categories: 种类表相应字段:CategoryID :类型ID:CategoryName:类型名;Description:类型说明;Picture:产品样本 ② CustomerCust ...

  5. Java 中日期的几种常见操作 —— 取值、转换、加减、比较

    Java 的开发过程中免不了与 Date 类型纠缠,准备总结一下项目经常使用的日期相关操作,JDK 版本 1.7,如果能够帮助大家节约那么几分钟起身活动一下,去泡杯咖啡,便是极好的,嘿嘿.当然,我只提 ...

  6. python: linux下安装redis

    Python连接时报拒绝连接,需要重装redis: 1) 卸载redis sudo apt-get remove redis-server sudo apt-get autoremove 2)编译安装 ...

  7. python: hashlib 加密模块

    加密模块hashlib import hashlib m=hashlib.md5() m.update(b'hello') print(m.hexdigest()) #十六进制加密 m.update( ...

  8. 更改printk打印级别

    1.查看当前控制台的打印级别 cat /proc/sys/kernel/printk 4    4    1    7 其中第一个"4"表示内核打印函数printk的打印级别,只有 ...

  9. 【转】利用xcode生成的app生成可以在iphone和itouch上运行的ipa安装包

    转载地址:http://blog.csdn.net/yohunl/article/details/5971252 在编译好的真机版目录下的.app文件,至于生成真机可以运行的app的方法,有两种方式, ...

  10. 20150625_Andriod_01_ListView1_条目选中

    android listview 参考地址: http://www.cnblogs.com/zhengbeibei/archive/2013/05/14/3078805.html  http://xy ...