博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Ural 1018 binary apple tree(显性树的树dp)
阅读量:7055 次
发布时间:2019-06-28

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

题意:一棵含n个节点的树,保留m条边,使含m条边的子树的边权和最大;

思路:树dp.求含m+1个节点边权和最大的子树。对每个分支节点有三种操作:剪去左子树;剪去右子树;将其节点数合理分配给左右子树;

        记以x为根,含k个节点的子树的最大边权和为g[x][k]。

        若x为叶节点,则g[x][k]为x通往父节点的边权;若非叶节点,枚举k-1个节点分配在左右子树的所有可能方案,找到最佳方案;

#include
#include
#include
#define N 256#define MAX(a,b) (a>b?a:b)using namespace std;int n,m,ne,x,y,z;//节点数为n,要保留的树枝数为m,边序号为ne,树枝边为(x,y),权为zint id[N],w[N],v[N],next[N],head[N],lch[N],rch[N],f[N];//第i条边的邻接点为id[i],边权为w[i],后继指针为next[i],节点x的邻接表指针为head[x],二叉树中节点i的左右儿子lch[i],rch[i]//父亲为f[i],通往父节点的边权为v[i]int g[N][N]; //状态转移方程void add(int x,int y,int z) //将边权为z的树枝边(x,y)加入邻接表{ id[++ne]=y; w[ne]=z; next[ne]=head[x]; head[x]=ne;}void dfs(int x) //从节点x出发,构造二叉树{ for(int p=head[x];p;p=next[p]) //搜索x的所有邻接边p if(id[p]!=f[x]) //若边p的邻接点非x的父亲,则作为x的左或右儿子 { if(!lch[x]) lch[x]=id[p]; else rch[x]=id[p]; f[id[p]]=x;v[id[p]]=w[p]; dfs(id[p]); //x作为边p的邻接点的父亲,设定边权,继续递归边p的邻接点 }}int dp(int x,int k) //从x出发,构造含k个节点且能留住最多苹果数的子树{ if(!k) return 0; if(g[x][k]>=0) return g[x][k]; //返回结果 if(!lch[x]) return (g[x][k]=v[x]); //若x为叶子,则返回x通往父节点的边权 for(int i=0;i

 

转载于:https://www.cnblogs.com/dashuzhilin/p/4541613.html

你可能感兴趣的文章
5G一周热闻:华为夺联通5G大单,首张5G电话卡发放
查看>>
调研对敏捷宣言2.0的需求
查看>>
微软在C# 8中引入预览版可空引用类型
查看>>
深究JavaScript——函数调用与this详解
查看>>
书评与访谈:Software Development Metrics
查看>>
re:Invent第二天:互联网客户在右传统客户在左,AWS向哪儿?
查看>>
云端能力知几许?12人众测华为云企业级Kubernetes集群实力
查看>>
《Elixir in Action》书评及作者问答录
查看>>
Apache HBase的现状和发展
查看>>
AlphaZero进化论:从零开始,制霸所有棋类游戏
查看>>
IBM中国开发中心吉燕勇: 通过Cloud Data Services打造新型认知计算数据分析云平台...
查看>>
作者问答:解密硅谷
查看>>
linux系统高并发socket最大连接数优化
查看>>
Netflix发布Polly.JS,一个用于HTTP交互的开源库
查看>>
敏捷团队中测试人员的角色
查看>>
GitHub推出Scientist,帮助开发者重构关键路径代码
查看>>
40%创业公司用伪AI忽悠钱,欧洲被AI时代抛弃了吗?
查看>>
AT&T签署8位数合同,设备商恐无法从5G获利
查看>>
Netflix Play API:我们为什么构建了一个演进式架构?
查看>>
我不是仆人,是主人!敏捷中领导力的新比喻?
查看>>