UVALive 4015 树形dp
题目大意:
从一个根节点出发,走最多 x 的长度,问最多能走过多少个节点,图保证是一棵树
dp[0][i][j] , 表示走从i点为根的子树走过了j个点最后回到 i 最少需要多少时间
dp[1][i][j] , 同理,但表示不需要回到 i
那么由儿子不断向父亲更新,有4种情况
1.if(dp[0][u][k+j]<0 || dp[0][u][k+j]>dp[0][v][j]+dp[0][u][k]+2*e[i].d)
dp[0][u][k+j]=dp[0][v][j]+dp[0][u][k]+2*e[i].d;
2.if(dp[1][u][k+j]<0 || dp[1][u][k+j]>dp[0][v][j]+dp[0][u][k]+e[i].d)
dp[1][u][k+j]=dp[0][v][j]+dp[0][u][k]+e[i].d;
3.if(dp[1][u][k+j]<0 || dp[1][u][k+j]>dp[1][v][j]+dp[0][u][k]+e[i].d)
dp[1][u][k+j]=dp[1][v][j]+dp[0][u][k]+e[i].d;
4.if(dp[1][u][k+j]<0 || dp[1][u][k+j]>dp[0][v][j]+dp[1][u][k]+2*e[i].d)
dp[1][u][k+j]=dp[0][v][j]+dp[1][u][k]+2*e[i].d;
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath> using namespace std;
#define N 505
#define ll long long
ll dp[][N][N];
int fa[N] , n , m;
int first[N],k; struct Edge{
int y , next , d;
Edge(int y= , int next= , int d=):y(y),next(next),d(d){}
}e[N<<]; void add_edge(int x , int y , int d)
{
e[k] = Edge(y , first[x] , d);
first[x] = k++;
} void dfs(int u)
{
dp[][u][] = ;
for(int i=first[u] ; ~i ; i=e[i].next){
int v = e[i].y;
dfs(v);
for(int k=n ; k>= ; k--)
{
if(dp[][u][k]<) continue;
for(int j= ; j<n ; j++){
if(dp[][v][j]<) continue;
if(dp[][u][k+j]< || dp[][u][k+j]>dp[][v][j]+dp[][u][k]+*e[i].d)
dp[][u][k+j]=dp[][v][j]+dp[][u][k]+*e[i].d;
if(dp[][u][k+j]< || dp[][u][k+j]>dp[][v][j]+dp[][u][k]+e[i].d)
dp[][u][k+j]=dp[][v][j]+dp[][u][k]+e[i].d; if(dp[][v][j]<) continue;
if(dp[][u][k+j]< || dp[][u][k+j]>dp[][v][j]+dp[][u][k]+e[i].d)
dp[][u][k+j]=dp[][v][j]+dp[][u][k]+e[i].d;
}
if(dp[][u][k]<) continue;
for(int j= ; j<=n ; j++){
if(dp[][v][j]<) continue;
if(dp[][u][k+j]< || dp[][u][k+j]>dp[][v][j]+dp[][u][k]+*e[i].d)
dp[][u][k+j]=dp[][v][j]+dp[][u][k]+*e[i].d;
}
}
}
} int main()
{
#ifndef ONLINE_JUDGE
freopen("a.in" , "r" , stdin);
#endif // ONLINE_JUDGE
int cas = ;
while(scanf("%d" , &n) , n)
{
printf("Case %d:\n" , ++cas);
memset(first , - , sizeof(first));
k = ;
for(int i= ; i<=n ; i++) fa[i]=i;
for(int i= ; i<n ; i++){
int u,v,d;
scanf("%d%d%d" , &u , &v , &d);
u++ , v++;
add_edge(v , u , d);
fa[u] = v;
}
int st;
for(int i= ; i<=n ; i++)
if(fa[i]==i) st = i; memset(dp , - , sizeof(dp));
dfs(st);
/*debug
for(int i=1 ; i<=n ; i++){
for(int j=1 ; j<=n ; j++){
printf("%4I64d" , dp[1][i][j]);
}
cout<<endl;
}*/
scanf("%d" , &m);
for(int i= ; i<m ; i++){
int x;
scanf("%d" , &x);
int ret = ;
for(int t= ; t<=n ; t++){
// cout<<dp[0][1][t]<<" "<<dp[1][1][t]<<endl;
if((dp[][st][t]<=x && dp[][st][t]>=) || (dp[][st][t]<=x && dp[][st][t]>=))
ret = max(ret , t);
}
printf("%d\n" , ret);
}
}
return ;
}
UVALive 4015 树形dp的更多相关文章
- 算法笔记--树的直径 && 树形dp && 虚树 && 树分治 && 树上差分 && 树链剖分
树的直径: 利用了树的直径的一个性质:距某个点最远的叶子节点一定是树的某一条直径的端点. 先从任意一顶点a出发,bfs找到离它最远的一个叶子顶点b,然后再从b出发bfs找到离b最远的顶点c,那么b和c ...
- 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个人去 ,根据题意我们可以很容易的得到如下递推公式 ...
- hdu1561 The more, The Better (树形dp+背包)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1561 思路:树形dp+01背包 //看注释可以懂 用vector建树更简单. 代码: #i ...
随机推荐
- C# 修改DataTable 列的 DataType
/// <summary> ///当DataTable中有值时,是不允许修改列的DataType /// 修改数据表DataTable某一列的数据类型和记录值 /// </summa ...
- 对js 面对对象编程的一些简单的理解
由简单开始深入: 最简单的 直接对象开始 var desen = { age:24, name:'xyf', job:'fontEnd', getName:function(){ console.lo ...
- IOS问题
#import "EXFifthViewController.h" @interface EXFifthViewController () @end @implementation ...
- react基础语法(一)元素渲染和基础语法规则
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- zc.buildout构建项目时报错‘AttributeError: '_NamespacePath' object has no attribute 'sort'’
在使用zc.buildout构建项目时如果碰到‘AttributeError: '_NamespacePath' object has no attribute 'sort'’报错: An inter ...
- 7-Java-C(搭积木)
题目描述: 小明最近喜欢搭数字积木, 一共有10块积木,每个积木上有一个数字,0~9. 搭积木规则: 每个积木放到其它两个积木的上面,并且一定比下面的两个积木数字小. 最后搭成4层的金字塔形,必须用完 ...
- 创建线程的三种方式_Callable和Runnable的区别
Java 提供了三种创建线程的方法 通过实现Runnable接口 通过继承Thread接口 通过Callable和Future创建线程 通过实现 Runnable 接口来创建线程 public cla ...
- java程序中中文没有乱码,存入数据库后中文乱码问题
jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/sys_user?useOldAliasMetadataBe ...
- Navicat 模型生成表
打开模型 -> 左上角文件 -> 导出SQL 打开sql文件,将sql在数据库执行,注意主键递增.日期类型 根据当前时间戳更新是否需要(默认选中的)等等
- JS简单实现防抖和节流
一.什么是防抖和节流 Ps: 比如搜索框,用户在输入的时候使用change事件去调用搜索,如果用户每一次输入都去搜索的话,那得消耗多大的服务器资源,即使你的服务器资源很强大,也不带这么玩的. 1. 防 ...