rivers ioi2005 树形dp
说句实话,写完这道题,很想吐一口血出来,以示我心情的糟糕;
题目很简单,树形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的更多相关文章
- 【BZOJ1812】[Ioi2005]riv 树形DP
[BZOJ1812][Ioi2005]riv Description 几乎整个Byteland王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了一条大河, ...
- BZOJ_1812_[Ioi2005]riv_树形DP
BZOJ_1812_[Ioi2005]riv_树形DP Description 几乎整个Byteland王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了 ...
- poj3417 LCA + 树形dp
Network Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4478 Accepted: 1292 Descripti ...
- COGS 2532. [HZOI 2016]树之美 树形dp
可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...
- 【BZOJ-4726】Sabota? 树形DP
4726: [POI2017]Sabota? Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 128 Solved ...
- 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)
题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...
- 树形DP
切题ing!!!!! HDU 2196 Anniversary party 经典树形DP,以前写的太搓了,终于学会简单写法了.... #include <iostream> #inclu ...
- BZOJ 2286 消耗战 (虚树+树形DP)
给出一个n节点的无向树,每条边都有一个边权,给出m个询问,每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接.最少的边权和是多少.(n<=250000,sigma(ki)<= ...
- POJ2342 树形dp
原题:http://poj.org/problem?id=2342 树形dp入门题. 我们让dp[i][0]表示第i个人不去,dp[i][1]表示第i个人去 ,根据题意我们可以很容易的得到如下递推公式 ...
随机推荐
- Mongodb添加地理位置索引
1.同步站点信息到mongo中(支持mysql.sqlserver数据同步) 2.在Collections文件夹下所在文档右键,在菜单中选择Add Index, 3.然后进行数据查询{ "m ...
- Cache-control使用:header('Cache-control:private')
发布:thebaby 来源:net [大 中 小] 转自:http://www.jbxue.com/article/5624.html网页缓存由 HTTP消息头中的“Cache-contr ...
- Source not found The JAR file …has no source attachment.
问题描述如下: 解决方案: 选中你的项目方案,然后鼠标右键选择属性Properties,如下图: 然后依次按下图操作就完成了.
- MongoDB工具简要说明
[mongodb@hadoop1 bin]$ pwd /usr/local/mongodb/bin [mongodb@hadoop1 bin]$ ls -l total 207696 -rwxr-xr ...
- CheckBox和RadioButton
多选按钮CheckBox的使用方法和常用的监听器:OnClickListener.OnCheckedChangeListener 在activity_main.xml中使用LinearLayout布局 ...
- ETL之增量抽取方式
1.触发器方式 触发器方式是普遍采取的一种增量抽取机制.该方式是根据抽取要求,在要被抽取的源表上建立插入.修改.删除3个触发器,每当源表中的数据发生变化,就被相应的触发器将变化的数据写入一个增量日志表 ...
- Android中使用WebView, WebChromeClient和WebViewClient加载网页
在android应用中,有时要加载一个网页,如果能配上一个进度条就更好了,而android 中提供了其很好的支持, 其中webView的一系列用法,比如 webView.getSettings().s ...
- JavaScript高级程序设计之数值数组排序
如果数组中全是Nunber类型,则可以按照数值大小排序 , , , , ]; // asc升序函数 function compareAsc(value1, value2) { if (value1 & ...
- OSGi之Bundle
OSGi提出的根源是什么?在我看来就是对JVM的类加载机制进行了扩展,添加了一系列的规则,使得原有的类包(Class Package)扩展到类域(Class Domain).然后是建立在类域上的一系列 ...
- UITableView表视图以及重建机制
表视图UITableView 表视图UITableView,是IOS中最重要的视图,随处可见 表视图通常用来管理一组具有相同数据结构的数据 UITableView继承自UIScrollView,所 ...