洛谷—— P2015 二叉苹果树
2017-09-14 17:04
453 查看
https://www.luogu.org/problem/show?pid=2015
题目描述
有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点)
这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1。
我们用一根树枝两端连接的结点的编号来描述一根树枝的位置。下面是一颗有4个树枝的树
2 5 \ / 3 4 \ / 1 现在这颗树枝条太多了,需要剪枝。但是一些树枝上长有苹果。
给定需要保留的树枝数量,求出最多能留住多少苹果。
输入输出格式
输入格式:
第1行2个数,N和Q(1<=Q<= N,1<N<=100)。
N表示树的结点数,Q表示要保留的树枝数量。接下来N-1行描述树枝的信息。
每行3个整数,前两个是它连接的结点的编号。第3个数是这根树枝上苹果的数量。
每根树枝上的苹果不超过30000个。
输出格式:
一个数,最多能留住的苹果的数量。
输入输出样例
输入样例#1:5 2 1 3 1 1 4 10 2 3 20 3 5 20输出样例#1:
21
f[i][j]表示节点i保留j个枝条能得到的最多苹果数
#include <cstdio> inline void read(int &x) { x=0; register char ch=getchar(); for(; ch>'9'||ch<'0'; ) ch=getchar(); for(; ch>='0'&&ch<='9'; ch=getchar()) x=x*10+ch-'0'; } const int N(105); int head ,sumedge; struct Edge { int v,w,next; Edge(int v=0,int next=0,int w=0): v(v),next(next),w(w){} }edge[N<<1]; inline void ins(int u,int v,int w) { edge[++sumedge]=Edge(v,head[u],w); head[u]=sumedge; edge[++sumedge]=Edge(u,head[v],w); head[v]=sumedge; } #define min(a,b) (a<b?a:b) #define max(a,b) (a>b?a:b) int n,q,f ; int DFS(int u,int fa) { int sum=0; for(int v,i=head[u]; i; i=edge[i].next) { v=edge[i].v; if(v==fa) continue; sum+=DFS(v,u)+1; for(int j=min(sum,q); j; --j) for(int k=0; k<j; ++k) f[u][j]=max(f[u][j],f[u][j-k-1]+f[v][k]+edge[i].w); } return sum; } int Presist() { read(n),read(q); for(int u,v,w,i=1; i<n; ++i) read(u),read(v),read(w),ins(u,v,w); DFS(1,0); printf("%d\n",f[1][q]); return 0; } int Aptal=Presist(); int main(){;}
相关文章推荐
- 洛谷P2015 二叉苹果树
- 洛谷P2015 二叉苹果树(树形dp)
- 洛谷P2015 二叉苹果树
- 【洛谷P2015】二叉苹果树
- 【洛谷2015】【CJOJ1976】二叉苹果树
- 树上操作 洛谷3178 bzoj4034 HAOI2015
- 洛谷 P2679 [NOIP2015 D2T2] 子串
- 洛谷 P3171 [CQOI2015]网络吞吐量
- BZOJ4009 & 洛谷3242 & LOJ2113:[HNOI2015]接水果——题解
- POJ 3258 River Hopscotch [NOIP2015 D2T1] (洛谷 P2678 跳石头)
- NOI 2015 d1t2 洛谷 【P2146】 软件包管理器
- 洛谷-神奇的幻方-NOIP2015提高组复赛
- 【NOIP2015】洛谷2680 运输计划【解法二】
- 洛谷 P1955[NOI2015]程序自动分析【离散化+并查集】
- 洛谷P3585 [POI2015]PIE
- 洛谷P2671 NOIP2015普及组 T3 求和
- 洛谷P4253:[SCOI2015]小凸玩密室 (DP)
- 洛谷P2678 跳石头(NOIp2015)
- 洛谷P2680 运输计划(NOIp2015)(BZOJ4326)
- 洛谷P2015 二叉苹果树