题目链接

题意:给定一棵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. android TextView加载html内容并加载图片

    package com.example.textviewfromhtml; import java.net.URL; import android.app.Activity; import andro ...

  2. Android ActivityThread(主线程或UI线程)简介

    1. ActivityThread功能 它管理应用进程的主线程的执行(相当于普通Java程序的main入口函数),并根据AMS的要求(通过IApplicationThread接口,AMS为Client ...

  3. WPFの单例模式

    版本一: /// <summary>/// A simple singleton class implements./// </summary>public sealed cl ...

  4. 数的n次方 s.match(reg) marquee滚动效果

    一.数的n次方 <script> alert(math.pow(a,5)); /*输出a的5次方*/ </script> 二. s.match(reg); s代表一个字符串,r ...

  5. 解决Win7下UAC开启时无法响应WM_DROPFILES消息

    //以管理员身份运行,程序窗口就可以接收到拖放文件消息[WM_DROPFILES]了. ChangeWndMessageFilterOk(WM_DROPFILES, MSGFLT_ADD); Chan ...

  6. 04-23 Android 课堂笔记

    1.调用 //暂停 @Override protected void onPause() { super.onPause(); Log.e("TAG", "onPause ...

  7. XML文件解析DOM解析和SAX解析

    解析一个XML文档有哪些内容解析有:dom和sax两种dom:把整个XML文档放入内存,适合XML随机访问,占用内存资源大sax:事件驱动型的XML解析方式,顺序读取,不用一次装载整个文件,遇到标签会 ...

  8. TeeChart中 Line的Clear方法

    需要注意的是,如果设置了Line.Smoothed=true; 那么调用Clear是无效的,虽然清除了曲线上的点. 但是界面上的曲线,并没有消失. 所以,在每一次Line.Clear();之前,必须确 ...

  9. 如何在iOS 7.0中隐藏状态栏

    使用Cordova做了一个小项目,在原来iOS6的时候显示挺好,升级为iOS7后,每次App启动后都会显示状态栏,而且状态栏和App的标题栏重叠在一起,非常难看,因此需要将状态栏隐藏起来.   首先, ...

  10. Linux链接库三(C跟C++之间动态库的相互调用)

    http://www.cppblog.com/wolf/articles/74928.html http://www.cppblog.com/wolf/articles/77828.html http ...