Codeforces 709E. Centroids 树形DP
2017-03-18 16:40
363 查看
题目链接:http://codeforces.com/contest/709/problem/E
[b]题意:[/b]
给你一棵树,你可以任删一条边和加一条边,只要使得其仍然是一棵树,输出每个点是否都能成为重心
[b]题解:[/b]
做题多动手,画一画;
假设要求当前节点i是否能经过操作成为重心,将它提起来为根,那么可以知道,就是选其中一颗子树提到以根为父亲的情况使得删去根之后每个子树点数和最多不超过n/2
回来看,这颗子树要么来自自身子树下,要么来自父亲节点,这个时候我们dfs出需要的东西,也就是能够提出来的子树点数和最大的且不超过n/2的那颗是多少,再进行判断
我的做法:找到每个节点以下的节点数目和能提出来的最多的数目 以及 最多 和 次多转移来的节点
[b]题意:[/b]
给你一棵树,你可以任删一条边和加一条边,只要使得其仍然是一棵树,输出每个点是否都能成为重心
[b]题解:[/b]
做题多动手,画一画;
假设要求当前节点i是否能经过操作成为重心,将它提起来为根,那么可以知道,就是选其中一颗子树提到以根为父亲的情况使得删去根之后每个子树点数和最多不超过n/2
回来看,这颗子树要么来自自身子树下,要么来自父亲节点,这个时候我们dfs出需要的东西,也就是能够提出来的子树点数和最大的且不超过n/2的那颗是多少,再进行判断
我的做法:找到每个节点以下的节点数目和能提出来的最多的数目 以及 最多 和 次多转移来的节点
#include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define ls i<<1 #define rs ls | 1 #define mid ((ll+rr)>>1) #define pii pair<int,int> #define MP make_pair typedef long long LL; const long long INF = 1e18+1LL; const double Pi = acos(-1.0); const int N = 5e5+10, maxn = 1e3+20, mod = 1e9+7, inf = 2e9; vector<int > G ; int ans ,submax ,max1 ,max2 ,sz ,n; void dfs(int u,int f) { sz[u] = 1; for(int i = 0; i < G[u].size(); ++i) { int to = G[u][i]; if(to == f) continue; dfs(to,u); sz[u] += sz[to]; if(submax[to] > submax[u]) { submax[u] = submax[to]; max2[u] = max1[u]; max1[u] = to; } else if(submax[max2[u]] < submax[to]) max2[u] = to; } if(sz[u] <= n/2) submax[u] = sz[u]; } void dfs(int u,int f,int pre) { int flag = 1; for(int i = 0; i < G[u].size(); ++i) { int to = G[u][i]; if(to == f) { int temp = n - sz[u]; if(temp>n/2 && temp - pre > n/2) flag = 0; } else { if(sz[to] > n/2 && sz[to] - submax[to] > n/2) flag = 0; } } ans[u] = flag; for(int i = 0 ; i < G[u].size(); ++i) { int to = G[u][i]; if(to == f) continue; int temp; if(n - sz[to] <= n/2) temp = n - sz[to]; else { if(to == max1[u]) temp = max(pre,submax[max2[u]]); else temp = max(pre,submax[max1[u]]); } dfs(to,u,temp); } } int main() { int u,v; scanf("%d",&n); for(int i = 1; i < n; ++i) { scanf("%d%d",&u,&v); G[u].push_back(v); G[v].push_back(u); } dfs(1,0); dfs(1,0,0); for(int i = 1; i <= n; ++i) cout<<ans[i]<<" "; return 0; }
相关文章推荐
- Codeforces 461B. Appleman and Tree[树形DP 方案数]
- codeforces 23E Tree (树形dp)
- 【树形DP】codeforces 219D Choosing Capital for Treeland
- codeforces 219D 【树形DP】
- CodeForces 160D - Distance in Tree 树形DP
- 树形DP 统计树中长度为K的路径数量 CodeForces 161D Distance in Tree
- SGU134 Centroid 树形DP,dfs建树
- Codeforces 239E World Eater Brothers【思维+树形Dp】
- Codeforces 815C. Karen and Supermarket 【树形DP】
- Codeforces 682C Alyona and the Tree(树形DP)
- Codeforces 77C 树形DP
- SGU - 134 Centroid 无根树转有根树 + 树形DP
- codeforces 855C Helga Hufflepuff's Cup (树形dp)
- 【Codeforces 743D】 Chloe and pleasant prizes【树形dp】
- codeforces 294E Shaass the Great (树形dp,好题)
- 【树形dp】Codeforces 238C World Eater Brothers
- codeforces 645 D Robot Rapping Results Report 【树形dp】
- codeforces 161D - Distance in Tree(树形dp)
- codeforces 274B Zero Tree(树形dp)
- [codeforces 219D] Choosing Capital for Treeland (树形dp)