博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 2378 Tree Cutting(树形DP,删点使得独立的部分结点数不超过n/2)
阅读量:4036 次
发布时间:2019-05-24

本文共 1024 字,大约阅读时间需要 3 分钟。

1、

2、题目大意:

一棵树有n个结点,现在要删除某个结点,使得分成的部分结点数最多不超过n/2个,题目与poj 3107类似,只是求得问题不同

用一个cnt[]数组记录下每个点有多少个子节点

那么我们要求的删除根节点u后剩余部分的最大数就是要么是u的子树中的最大值,要么是除去以u为根的树外的剩余结点数dp[u]=max(max(cnt[v]),n-cnt[u]);

 

3、AC代码:

#include
#include
#include
using namespace std;#define N 20005#define INF 20010int v[N],next[N],head[N];int tot,ans,res,n;int cnt[N];int dp[N];void add_edge(int a,int b){ v[tot]=b; next[tot]=head[a]; head[a]=tot++;}void dfs(int u,int fa){ cnt[u]=1; for(int i=head[u];i!=-1;i=next[i]) { int vv=v[i]; if(vv!=fa) { dfs(vv,u); cnt[u]+=cnt[vv]; ans=max(ans,cnt[vv]); } } dp[u]=max(ans,n-cnt[u]); res=min(res,dp[u]);}int main(){ int a,b; scanf("%d",&n); memset(head,-1,sizeof(head)); memset(cnt,0,sizeof(cnt)); tot=0; for(int i=1;i
n/2) printf("NONE\n"); else { for(int i=1;i<=n;i++) { if(dp[i]<=n/2) printf("%d\n",i); } } return 0;}

 

转载地址:http://qrddi.baihongyu.com/

你可能感兴趣的文章
Android 跨应用程序访问窗口知识点总结
查看>>
各种排序算法的分析及java实现
查看>>
SSH框架总结(框架分析+环境搭建+实例源码下载)
查看>>
js弹窗插件
查看>>
自定义 select 下拉框 多选插件
查看>>
js判断数组内是否有重复值
查看>>
js获取url链接携带的参数值
查看>>
gdb 调试core dump
查看>>
gdb debug tips
查看>>
arm linux 生成火焰图
查看>>
linux和windows内存布局验证
查看>>
linux config
查看>>
linux insmod error -1 required key invalid
查看>>
linux kconfig配置
查看>>
linux不同模块completion通信
查看>>
linux printf获得时间戳
查看>>
C语言位扩展
查看>>
linux dump_backtrace
查看>>
linux irqdebug
查看>>
git 常用命令
查看>>