题目链接:POJ - 2378

题目大意:给你n个点,然后问你这n个点中 ,去除哪些点能够使得剩下的图中最大的连通块中点的个数不超过n/2.

具体思路:第一遍dfs记录每一个点代表的子树大小,第二遍dfs记录每一个点去除的情况下,所剩余的图中最大的联通块中点的个数。

dp[i][0]代表当前i点所代表的子树大小-1

dp[i][1]代表当前i点去除的情况下,所剩余的图中最大的连通块中点的个数。

AC代码:

 #include<iostream>
#include<stdio.h>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstring>
#include<vector>
using namespace std;
# define ll long long
const int maxn = 2e5+;
# define inf 0x3f3f3f3f
int dp[maxn][];
int vis[maxn];
vector<int>Edge[maxn];
int n;
void init(){
for(int i=;i<=n;i++){vis[i]=;}
}
void dfs1(int u){
vis[u]=;
for(int i=;i<Edge[u].size();i++){
int to=Edge[u][i];
if(vis[to])continue;
dfs1(to);
dp[u][]+=dp[to][];
}
}
void dfs2(int u){
vis[u]=;
dp[u][]=n-dp[u][];
for(int i=;i<Edge[u].size();i++){
int to=Edge[u][i];
if(vis[to])continue;
dfs2(to);
dp[u][]=max(dp[u][],dp[to][]);
}
}
int main()
{
int st,ed;
scanf("%d",&n);
for(int i=;i<=n;i++){dp[i][]=;}
for(int i=; i<n; i++)
{
scanf("%d %d",&st,&ed);
Edge[st].push_back(ed);
Edge[ed].push_back(st);
}
init();
dfs1();
init();
dfs2();
int flag=;
for(int i=; i<=n; i++)
{
if(dp[i][]*<=n)
{
flag=;
printf("%d\n",i);
}
}
if(flag)
printf("NONE\n");
return ;
}

Tree Cutting POJ - 2378 (树形DP)的更多相关文章

  1. poj 2378(树形dp)

    题目链接:http://poj.org/problem?id=2378 思路:num[u]表示以u为根的子树的顶点个数(包括),如果去掉u之后u的每棵子树都小于等于n/2,则选择u. #include ...

  2. HDU 5909 Tree Cutting(FWT+树形DP)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5909 [题目大意] 给出一棵树,其每棵连通子树的价值为其点权的xor和, 问有多少连通子树的价值为 ...

  3. POJ 2378 树形DP??

    思路: 找到每个节点的儿子size的最大值 和n-当前节点size 取个Max //By SiriusRen #include <cstdio> #include <cstring& ...

  4. Fire (poj 2152 树形dp)

    Fire (poj 2152 树形dp) 给定一棵n个结点的树(1<n<=1000).现在要选择某些点,使得整棵树都被覆盖到.当选择第i个点的时候,可以覆盖和它距离在d[i]之内的结点,同 ...

  5. poj 1463(树形dp)

    题目链接:http://poj.org/problem?id=1463 思路:简单树形dp,如果不选父亲节点,则他的所有的儿子节点都必须选,如果选择了父亲节点,则儿子节点可选,可不选,取较小者. #i ...

  6. poj 2486( 树形dp)

    题目链接:http://poj.org/problem?id=2486 思路:经典的树形dp,想了好久的状态转移.dp[i][j][0]表示从i出发走了j步最后没有回到i,dp[i][j][1]表示从 ...

  7. poj 3140(树形dp)

    题目链接:http://poj.org/problem?id=3140 思路:简单树形dp题,dp[u]表示以u为根的子树的人数和. #include<iostream> #include ...

  8. Strategic game(POJ 1463 树形DP)

    Strategic game Time Limit: 2000MS   Memory Limit: 10000K Total Submissions: 7490   Accepted: 3483 De ...

  9. poj 3345 树形DP 附属关系+输入输出(好题)

    题目连接:http://acm.hust.edu.cn/vjudge/problem/17665 参考资料:http://blog.csdn.net/woshi250hua/article/detai ...

随机推荐

  1. ZHS16GBK的数据库导入到字符集为AL32UTF8的数据库

    字符集为ZHS16GBK的数据库导入到字符集为AL32UTF8的数据库  相信大家都对字符集有相当的了解了,废话就不多说了!直接步入正题:这里主要是测试含有 汉字的数据从ZHS16GBK的数据库导入到 ...

  2. IDEA导入项目jar包红线、依赖问题....

    一般遇到这种情况用以下两种方式解决....... 1.reimport包 2.清缓存重启 针对1方法: a.确实不缺包: 可以先注释掉pom文件中的jar包, 此时idea会提示import, 那就i ...

  3. 转载:img是什么元素?置换元素?

    转载: https://blog.csdn.net/kingliguo/article/details/52643594 img是什么元素? 应是行内元素,判断一个元素是行内元素,还是块元素,无非就是 ...

  4. maven导入外部jar包的方法

    maven的导入外部jar包的方法(前提还有外部jar包) 1.问题: 在maven添加依赖包时,添加不成功,可以选择通过外部命令导入到仓库里. 2.命令:(在Dos命令行) mvn install: ...

  5. Git操作记录

    记录一些用过的操作 增加远程推送分支 git remote add orgin http://xxxxx.git 直接新建本地分支,将远程分支提取出来. git checkout -t origin/ ...

  6. linux的dd命令

    一.dd命令的解释 dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. 注意:指定数字的地方若以下列字符结尾,则乘以相应的数字:b=512:c=1:k=1024:w=2 参数注释: 1. ...

  7. MySQL——合并查询结果

    利用  UNION 关键字,可以给出多条  SELECT  语句,并将它们的结果组合成一个结果集.合并时,两个表对应的列数和数据类型必须相同.SELECT 语句之间使用  UNION  或  UNIO ...

  8. EntityFramework Core笔记:保存数据(4)

    1. 基本保存 每个DBContext实例都有一个ChangeTracker,负责跟踪需要写入数据库的更改.当实例发生更改时,更改会被记录在ChangeTracker中,在调用 SaveChanges ...

  9. Kafka学习笔记-如何保证高可用

    一.术语 1.1 Broker Kafka 集群包含一个或多个服务器,服务器节点称为broker. broker存储topic的数据. 如果某topic有N个partition,集群有N个broker ...

  10. js 实现数据结构 -- 集合

    原文: 在Javascript 中学习数据结构与算法. 概念: 即数学中的集合,在计算机科学中被应用成数据结构. 当然,集合中的数据具有不重复的特性.js 集合的原理大致上是 Object 的键值对 ...