说句实话,写完这道题,很想吐一口血出来,以示我心情的糟糕;

题目很简单,树形dp,正常做30分钟,硬是做了好几个小时,真是伤心。

题解不写了,只是吐个槽,网上没有用背包写的dp,全是左儿子右兄弟写法,没法对照一下,难受啊。

代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define LL long long
int n,K;
const int maxn=;
const LL inf=3000000000LL;
struct node{
int y,next,v;
}e[maxn];
int linkk[maxn],len=,w[maxn],d[maxn][maxn],siz[maxn],q[maxn],tail=,fa[maxn],ru[maxn],vis[maxn];
int read(){
int x=;char ch=getchar();bool flag=;
while(ch<''||ch>''){if(ch=='-')flag=;ch=getchar();}
while(ch<=''&&ch>=''){x=x*+ch-'';ch=getchar();}
return flag?-x:x;
}
void insert(int x,int y,int v){
e[++len].y=y;
e[len].v=v;
e[len].next=linkk[x];
linkk[x]=len;
}
void print(int x){printf("%d\n",x);}
void print(int x,int y){printf("%d %d\n",x,y);}
void init(){
int y,v;
n=read(),K=read();
memset(d,,sizeof(d));
for(int i=;i<=n;i++){
w[i]=read(),y=read(),v=read();
insert(i,y,v);insert(y,i,v);
d[i][y]=v,d[y][i]=v;
} }
void findd(){
for(int i=;i<=n;i++)d[i][i]=;
for(int k=;k<=n;k++)
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(d[i][k]+d[k][j]<d[i][j])d[i][j]=d[i][k]+d[k][j];
}
LL f[][][];
void dfs(int x,int f){
siz[x]=;
fa[x]=f;
for(int i=linkk[x];i;i=e[i].next){
if(e[i].y==f)continue;
dfs(e[i].y,x);
siz[x]+=siz[e[i].y];
ru[x]++;
}
if(siz[x]==)q[++tail]=x;
}
void work(){
memset(f,-,sizeof(f));
findd();
dfs(,);
for(int head=;head<=tail;head++){
int x=q[head];
ru[fa[x]]--;
if(ru[fa[x]]==)q[++tail]=fa[x];
LL g[];
for(int k=;k<=siz[x]&&k<=K;k++){
for(int prev=fa[x];prev!=-;prev=fa[prev]){ for(int p=;p<=k;p++)g[p]=;
for(int i=linkk[x];i;i=e[i].next){
if(e[i].y==fa[x])continue;
LL minn=inf;
for(int j=k;j>=;j--){
minn=inf;
for(int l=;l<=siz[e[i].y]&&l<=j;l++)
minn=min(minn,g[j-l]+f[e[i].y][l][prev]);
g[j]=minn;
}
}
LL ans=g[k]+w[x]*d[prev][x];
for(int p=;p<=k;p++)g[p]=;
for(int i=linkk[x];i;i=e[i].next){
if(e[i].y==fa[x])continue;
LL minn=inf;
for(int j=k-;j>=;j--){
minn=inf;
for(int l=;l<=siz[e[i].y]&&l<=j;l++)
minn=min(minn,g[j-l]+f[e[i].y][l][x]);
g[j]=minn;
}
}
f[x][k][prev]=min(ans,k-<?inf:g[k-]);
if(!prev)break;
}
}
}
cout<<f[][K][]<<endl;
}
int main(){
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
init();
work();
}

rivers ioi2005 树形dp的更多相关文章

  1. 【BZOJ1812】[Ioi2005]riv 树形DP

    [BZOJ1812][Ioi2005]riv Description 几乎整个Byteland王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了一条大河, ...

  2. BZOJ_1812_[Ioi2005]riv_树形DP

    BZOJ_1812_[Ioi2005]riv_树形DP Description 几乎整个Byteland王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了 ...

  3. poj3417 LCA + 树形dp

    Network Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4478   Accepted: 1292 Descripti ...

  4. COGS 2532. [HZOI 2016]树之美 树形dp

    可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...

  5. 【BZOJ-4726】Sabota? 树形DP

    4726: [POI2017]Sabota? Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 128  Solved ...

  6. 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)

    题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...

  7. 树形DP

    切题ing!!!!! HDU  2196 Anniversary party 经典树形DP,以前写的太搓了,终于学会简单写法了.... #include <iostream> #inclu ...

  8. BZOJ 2286 消耗战 (虚树+树形DP)

    给出一个n节点的无向树,每条边都有一个边权,给出m个询问,每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接.最少的边权和是多少.(n<=250000,sigma(ki)<= ...

  9. POJ2342 树形dp

    原题:http://poj.org/problem?id=2342 树形dp入门题. 我们让dp[i][0]表示第i个人不去,dp[i][1]表示第i个人去 ,根据题意我们可以很容易的得到如下递推公式 ...

随机推荐

  1. Hive中典型的表内数据除重写法

    insert overwrite table store select t.p_key,t.sort_word from ( select p_key, sort_word , row_number( ...

  2. 三种找回 linux root密码

    找回 linux root密码的三种方法 第1种方法: 1.在系统进入单用户状态,直接用passwd root去更改2.用安装光盘引导系统,进行linux rescue状态,将原来/分区挂接上来,作法 ...

  3. Lua 的函数库 01

    这里只介绍和插件编写比较有关的几个函数. 详细的Lua手册请参照Lua Reference Manual 5.1. table函数库 一部分的table函数只对其数组部分产生影响, 而另一部分则对整个 ...

  4. c#写入Mysql中文显示乱码 解决方法

    如题,mysql字符集utf8,c#写入中文后,全部显示成?,一个汉字对应一个?解决方法:在数据库连接字符串中增加字符集的说明,Charset=utf8,如 MySQLConnection con = ...

  5. 重定向语句Response.Redirect()方法与Response.RedirectPermanent()对搜索引擎页面排名的影响

    在ASP.NET中,开发人员经常使用Response.Redirect()方法,用编程的手法,将对老的URL的请求转到新的URL上.但许多开发人员没有意识到的是,Response.Redirect() ...

  6. MHA 日常管理

    一.MHA的主要脚本 1.manager端 masterha_check_ssh 检查MHA的SSH配置状况 masterha_check_repl 检查MySQL复制状况 masterha_mang ...

  7. NOJ1103-全排列

    全排列 时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte总提交 : 1148            测试通过 : 302  ...

  8. MIFARE系列5《存储结构》

    Mifare S50把1K字节的容量分为16个扇区(Sector0-Sector15),每个扇区包括4个数据块(Block0-Block3),我们也将16个扇区的64个块按绝对地址编号为0~63,每个 ...

  9. 关于使用 Connect-Busboy 实现文件上传 优化说明

    这篇博文完全上关于上一篇的优化 先看上一篇 node.js 在 Express4.0 框架使用 Connect-Busboy 实现文件上传 因为从上次博客改用 connect-busboy 来上传文件 ...

  10. TCP/IP,HTTP,Socket的区别与联系

    一 忆往昔,尽是悔恨泪.       在学校的时候学过,网络七层,也知道tcp的三次握手.但因为根本没用在实际开发中,所以逐渐淡忘.现在就再次理解下三个的区别与联系. 二 正题       网络七层: ...