codeforces802 J&&K Send the Fool Further! (easy&&medium) -- 树形DP
来源:互联网 发布:wecut美图软件 编辑:程序博客网 时间:2024/06/01 09:59
题目大意:
给定一棵树,求从根开始经过所有点次数不大于k的路径的最大长度(经过一条边多次只计算一次长度)。
显然一棵子树最多只会经过一次。
令f[i]表示以i为根的子树中的答案,g[i]表示在以i为根的子树中,最终点在i的答案,dist[i]表示第i个点与他父亲的距离。
那么g[i]就等于所有儿子的最大k-1个g+dist之和。
求f[i]时,枚举每个儿子j,将以j为根的子树作为最终点,用g[i]+f[j]+dist[j]更新f[i],注意判断重复。
然后输出f[0]就可以了。
代码:
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<queue>using namespace std;#define N 100010priority_queue<int>Q;struct Edge{ int t,w,nx;}e[N<<1];struct Node{ int w,f; Node(){} Node(int w,int f):w(w),f(f){};}a[N];int i,j,k,n,m,h[N],x,y,z,Num,f[N],g[N],b[N],M,Top,Sum;inline void Add(int x,int y,int z){e[++Num].t=y;e[Num].w=z;e[Num].nx=h[x];h[x]=Num;}inline int Max(int x,int y){return x<y?y:x;}inline bool Cmp(Node a,Node b){return a.w>b.w;}inline void Getf(int x,int y){ Top=Sum=0; for(int i=h[x];i;i=e[i].nx) if(e[i].t!=y){ Sum+=g[e[i].t]+e[i].w; a[++Top]=Node(g[e[i].t]+e[i].w,e[i].t); } if(Top<=k){ for(int i=1;i<=Top;i++) f[x]=Max(f[x],Sum-g[a[i].f]+f[a[i].f]); return; } sort(a+1,a+Top+1,Cmp); Sum=0; for(int i=1;i<k;i++)b[a[i].f]=x,Sum+=a[i].w; for(int i=1;i<k;i++)f[x]=Max(f[x],a[k].w+Sum-g[a[i].f]+f[a[i].f]); for(int i=h[x];i;i=e[i].nx) if(e[i].t!=y&&b[e[i].t]!=x)f[x]=Max(f[x],Sum+f[e[i].t]+e[i].w);}inline void Getg(int x,int y){ Top=0; for(int i=h[x];i;i=e[i].nx) if(e[i].t!=y)a[++Top]=Node(g[e[i].t]+e[i].w,e[i].t); sort(a+1,a+Top+1,Cmp); for(int i=1;i<k&&i<=Top;i++)g[x]+=a[i].w;}inline void Dfs(int x,int y){ for(int i=h[x];i;i=e[i].nx) if(e[i].t!=y)Dfs(e[i].t,x); Getf(x,y);Getg(x,y);}int main(){ scanf("%d%d",&n,&k); for(i=1;i<n;i++)scanf("%d%d%d",&x,&y,&z),Add(++x,++y,z),Add(y,x,z); Dfs(1,0); printf("%d\n",f[1]); return 0;}
阅读全文
1 0
- codeforces802 J&&K Send the Fool Further! (easy&&medium) -- 树形DP
- codeforces 802K Send the Fool Further! (medium) 树形dp
- Codeforces 802J Send the Fool Further! (easy) 题解
- Codeforces802D-Send the Fool Further! (medium)
- codeforces802 A&&B Heidi and Library (easy&&medium)
- The Fool
- SRM 719 div1 Medium (树形dp)
- poj 2342 Anniversary party,树形DP easy
- dp优化专辑 J -Maximize Game Time [树形dp]
- Lear, Tolstoy and the Fool
- Gym 100962J Jimi Hendrix (DFS + 树形dp)
- HDU1561 The more,The better 树形DP
- HDOJ The more, The Better 树形DP
- HDU1561 树形DP The more, The Better
- HDU1561 The more, The Better(树形dp)
- [hdu1561] The more, The Better 【树形DP】
- 【树形DP】HDU1561-The more, The Better
- hdu1561 The more, The Better--树形dp
- IO流之序列化和反序列化
- 矩阵快速幂模板
- opencv3_java 图像的Scalar标量合成 AddScalar
- Java基础--Java访问权限控制(访问权限修饰词)
- 南阳理工第八题
- codeforces802 J&&K Send the Fool Further! (easy&&medium) -- 树形DP
- oj 2002: C语言实验——单词统计
- servlet学习(一)
- Restore IP Addresses
- 多态、向上转型与向下转型
- 陕西邀请赛B题
- Spring AOP的实现原理
- 【Sql】sql优化之细谈
- 计算机网络-运输层&应用层