贪吃的九头龙

Time Limit 1000ms

Memory Limit 65536K

description

    传说中的九头龙是一种特别贪吃的动物。虽然名字叫“九头龙”,但这只是说它出生的时候有九个头,而在成长的过程中,它有时会长出很多的新头,头的总数会远大于九,当然也会有旧头因衰老而自己脱落。 有一天,有M个脑袋的九头龙看到一棵长有N个果子的果树,喜出望外,恨不得一口把它全部吃掉。可是必须照顾到每个头,因此它需要把N个果子分成M组,每组至少有一个果子,让每个头吃一组。 这M个脑袋中有一个最大,称为“大头”,是众头之首,它要吃掉恰好K个果子,而且K个果子中理所当然地应该包括唯一的一个最大的果子。果子由N-1根树枝连接起来,由于果树是一个整体,因此可以从任意一个果子出发沿着树枝“走到”任何一个其他的果子。 对于每段树枝,如果它所连接的两个果子需要由不同的头来吃掉,那么两个头会共同把树枝弄断而把果子分开;如果这两个果子是由同一个头来吃掉,那么这个头会懒得把它弄断而直接把果子连同树枝一起吃掉。当然,吃树枝并不是很舒服的,因此每段树枝都有一个吃下去的“难受值”,而九头龙的难受值就是所有头吃掉的树枝的“难受值”之和。 九头龙希望它的“难受值”尽量小,你能帮它算算吗? 例如图1所示的例子中,果树包含8个果子,7段树枝,各段树枝的“难受
值”标记在了树枝的旁边。九头龙有两个脑袋,大头需要吃掉4个果子,其中必
须包含最大的果子。即N=8,M=2,K=4:
图一描述了果树的形态,图二描述了最优策略。
大头吃4个果子,用实心点标识;
小头吃4个果子,用空心点标识;
九头龙的难受值为4,因为图中用细边标
记的树枝被大头吃掉了。
图一                                      图二 

input

多组输入
每组输入的第1行包含三个整数N(1<=N<=300),M(2<=M<=N),K(1<=K<=N)。N个果子依次编号1,2,...,N,且最大的果子的编号总是1。第2行到第N行描述了果树的形态,每行包含三个整数a(1<=a<=N),b(1<=b<=N),c(0<=c<=105),表示存在一段难受值为c的树枝连接果子a和果子b。

output

每组输出一行,包含一个整数,表示在满足“大头”的要求的前提下,九头龙的难受值的最小值。如果无法满足要求,输出-1。

sample_input

8 2 4
1 2 20
1 3 4
1 4 13
2 5 10
2 6 12
3 7 15
3 8 5

sample_output

4

hint

该样例对应于题目描述中的例子。 

source

NOI 2002 贪吃的九头龙

思路:树上的背包。

dp[u][k][t] u节点大头已经吃了k个果子,是否大头吃当前果子

#include<cstdio>
#include<cstring>
#include<iostream>
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define clr(f,z) memset(f,z,sizeof(f))
using namespace std;
const int mm=307;
const int oo=0x3f3f3f3f;
int dp[mm][mm][2];///u节点,大头吃了x个,大小头
int g[mm][2];
bool vis[mm];
class Edge
{public:int v,next,w;
}e[mm+mm];
int head[mm],edge;
void data()
{clr(head,-1);edge=0;
}
void add(int u,int v,int w)
{e[edge].v=v;e[edge].w=w;e[edge].next=head[u];head[u]=edge++;
}
int N,M,K;
void DP(int u)
{ int v,kill;vis[u]=1;bool leaf=1;for(int i=head[u];~i;i=e[i].next){v=e[i].v;if(vis[v])continue;DP(v);kill=M>2?0:e[i].w;if(leaf){leaf=0;for(int j=0;j<=K;++j)///1 当前点给大头吃{dp[u][j][0]=min(dp[v][j][0]+kill,dp[v][j][1]);dp[u][j+1][1]=min(dp[v][j][0],dp[v][j][1]+e[i].w);}}else{FOR(j,0,K)g[j][0]=g[j][1]=oo;FOR(j,0,K)for(int k=K-j;k>=0;--k){g[j+k][0]=min( min(g[j+k][0],dp[u][j][0]+dp[v][k][0]+kill),dp[u][j][0]+dp[v][k][1] );g[j+k+1][1]=min( min(g[j+k+1][1],dp[u][j+1][1]+dp[v][k][0]),dp[u][j+1][1]+dp[v][k][1]+e[i].w );}FOR(j,0,K)dp[u][j][0]=g[j][0],dp[u][j][1]=g[j][1];}}if(leaf)dp[u][0][0]=dp[u][1][1]=0;///叶子节点
}
int main()
{ int a,b,c;while(~scanf("%d%d%d",&N,&M,&K)){ data();FOR(i,2,N){scanf("%d%d%d",&a,&b,&c);add(a,b,c);add(b,a,c);}if(N-M<K){printf("-1\n");continue;}clr(dp,0x3f);clr(vis,0);DP(1);printf("%d\n",dp[1][K][1]);}
}

NEFU 262 贪吃的九头龙(树形背包,4级)相关推荐

  1. vijos 1523 贪吃的九头龙

    http://www.elijahqi.win/archives/1191 背景 安徽省芜湖市第二十七中学测试题 NOI 2002 贪吃的九头龙(dragon) Description:Officia ...

  2. BSOJ 1480 贪吃的九头龙

    BSOJ 1480 贪吃的九头龙 NOI原题,下了数据,都过了.但是OJ现在挂了... 首先,脑袋的数量都是唬人的.如果至少3个脑袋的话,完全可以做到不让两个小头在一起(不过当只有2个头的时候得特别考 ...

  3. NOI2002 贪吃的九头龙

    P2940 贪吃的九头龙 时间: 1000ms / 空间: 65536KiB / Java类名: Main 描述 贪吃的九头龙(dragon.pas/c/cpp) [问题描述] 传说中的九头龙是一种特 ...

  4. codevs贪吃的九头龙

    传说中的九头龙是一种特别贪吃的动物.虽然名字叫"九头龙",但这只是说它出生的时候有九个头,而在成长的过程中,它有时会长出很多的新头,头的总数会远大于九,当然也会有旧头因衰老而自己脱 ...

  5. codevs1746 贪吃的九头龙

    [问题描述] 传说中的九头龙是一种特别贪吃的动物.虽然名字叫"九头龙",但这只是说它出生的时候有九个头,而在成长的过程中,它有时会长出很多的新头,头的总数会远大于九,当然也会有旧头 ...

  6. 【NOI2002】贪吃的九头龙

    Description 传说中的九头龙是一种特别贪吃的动物.虽然名字叫"九头龙",但这只是说它出生的时候有九个头,而在成长的过程中,它有时会长出很多的新头,头的总数会远大于九,当然 ...

  7. 九头蛇与大象之争,Hydra或将取代Hadoop

    [编者按]Hadoop被认为是最好的大数据分析平台,本身就具有较好的性能,还有活跃的开源社区支持,Hadoop创始人Doug Cutting也曾预言未来Hadoop不仅仅用于大数据处理,还将成为数据平 ...

  8. 大数据 addthis hydra 九头蛇的学习 第一章

    Hydra (九头蛇简介) Hydra(九头蛇),分布式任务处理系统,由社交标签服务提供商AddThis六年前开发,现在已得到Apache的开源许可,就像Hadoop一样,只是还没有Hadoop那样的 ...

  9. “九头虫”病毒技术分析报告

    2019独角兽企业重金招聘Python工程师标准>>> ##一.背景介绍 近日,阿里移动安全收到多方用户反馈,手机中了一种难以清除的病毒.病毒一旦发作,设备将不断弹出广告,并自动下载 ...

  10. Medusa(美杜莎)和Hydra(九头蛇)快速入门手册:01

    今天主要是初步介绍一些Hydra和Medusa的分析和内容,旨在方便快速入门,这是第一部分Medusa,后面附带一些字典,之所以是写一起,我是觉得这两个都是不错的工具,不应该分开的,在这种思想下就汇总 ...

最新文章

  1. Jndroid——用应用开发的思路来开发 Web
  2. yii mysql_Yii2框架操作数据库的方法分析【以mysql为例】
  3. Java 进程间文件锁FileLock详解
  4. OpenCV-Python bindings是如何生成的(1)
  5. web自动化原理揭秘
  6. 获取某数据库中含有某字段的所有表的脚本
  7. 【BZOJ10561862】【codevs1985】排名系统,Splay+trie树
  8. 网约代收垃圾App火了!别笑,垃圾分类下一个就到你了
  9. Netty工作笔记0005---NIO介绍说明
  10. 卸载vuecli3_112、vue-cli3安装遇到的问题,卸载不掉旧版本,导致更新不了
  11. window.URL对象的使用方式
  12. 陈风莲(帮别人名字作诗)
  13. 数据泵导入报错ORA-39125和LPX-00225
  14. Android图库选择图片
  15. 作用域和作用域链 精解
  16. 有一个已经排好序的数组,要求输入一个数后,按原来排序规律将它插入数组中。
  17. 亚马逊运营listing优化A+页面
  18. 微信小程序支付绑定商户号问题
  19. 新的一年,那些晴耕小筑要填的坑
  20. C# WPF 建立无边框(标题栏)的登录窗口的示例

热门文章

  1. Java,设计,功能权限和数据权限,用户、角色、权限和用户组
  2. fractional max pooling 和 multi-sample dropout
  3. 104 自定义大头针
  4. 操作系统锁的实现方法有哪几种_深入理解多线程(四)——Moniter的实现原理...
  5. 程序员租房福利! 最新 2018年上海公积金提取 租房提取
  6. 【verilog】b站-[Verilog HDL] Installing and Testing Icarus Verilog + GTKWave 笔记
  7. 【您有一封来自阿里云的邀请函】阿里云成都客户服务中心20+职位虚席以待,来吧,成就最好的自己!...
  8. swoole安装教程人人商城互动直播通信服务启用教程
  9. 重置CISCO 2911SEC/K9路由器密码
  10. uni-app 学习笔记(三)uni-app中的各种引用