hdu4276 依赖背包
网上题解都是用spfa求1-n路径的,但其实dfs一次就可以了。。
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <iomanip> using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
#define maxn 1000005
#define MOD 1000000007
#define mem(a , b) memset(a , b , sizeof(a))
#define LL long long
#define INF 100000000 int n , t;
struct edge
{
int u , v , w;
int next;
}E[*];
int head[];
int dp[][];
int val[];
int cost[] , per[];
int id,sum ,flag ; void add(int u , int v , int w)
{
E[id].u = u;
E[id].v = v;
E[id].w = w;
E[id].next = head[u];
head[u] = id++;
}
/*
void spfa()
{
mem(per , -1);
for(int i = 2 ; i <= n ; i ++) cost[i] = INF;
cost[1] = 0;
queue<int>q;
q.push(1);
while(!q.empty())
{
int u = q.front();
q.pop();
for(int i = head[u] ; i >= 0 ; i = E[i].next)
{
if(cost[E[i].v] > cost[u] + E[i].w)
{
cost[E[i].v] = cost[u] + E[i].w;
per[E[i].v] = i;
q.push(E[i].v);
}
}
}
for(int i = 1 ; i <= n ; i ++) cout << per[i] << endl;
for(int i = per[n] ; i >= 0 ; i = per[i])
{
cout << E[i].u << " " << E[i].v << " " << E[i].w << endl;
E[i].w = 0;
}
}*/
/*
bool judge(int u,int pre)///找出1~n的路径
{
if(u == n)return true;
for(int i = head[u]; i != -1 ; i = E[i].next)
{
int v = E[i].v;
if(v == pre)continue;
if(judge(v,u))
{
sum += E[i].w;
E[i].w=0;
return true;
}
}
return false;///这句话必须有,因为这一句我没写WA到死.....
}
*/ int judge(int u , int per)
{
int flag=;if(u==n)return ;
for(int i = head[u] ; i >= ; i = E[i].next )
{
if(E[i].v == per) continue;
if(judge(E[i].v,u)) {sum += E[i].w ; E[i].w = ; flag = ;}
else E[i].w*=;
}
return flag;
} void solve(int u , int per)
{
for(int i = head[u] ; i >= ; i = E[i].next)
{
if(E[i].v == per) continue;
solve(E[i].v , u);
for(int j = t ; j >= E[i].w ; j --)
{
int up = j - E[i].w;
for(int k = ; k <= up ; k ++)
{
// if(dp[u][up-k] != -1 && dp[E[i].v][k] != -1)
dp[u][j] = max(dp[u][j] , dp[u][up-k] + dp[E[i].v][k]);
}
}
}
} int main()
{
while(scanf("%d %d" , &n , &t) != EOF)
{
mem(dp , );id = ;
mem(head , -);
int u , v , w;
for(int i = ; i < n ; i ++)
{
scanf("%d %d %d" , &u , &v , &w);
//if(u > v) swap(u , v);
add(u , v , w);
add(v , u , w);
}
for(int i = ; i <= n ; i ++)
{
scanf("%d" , &val[i]);
for(int j = ; j <= t ; j ++) dp[i][j] = val[i];
}
flag = sum = ;
judge( , -);
//spfa();
if(sum > t)
{
printf("Human beings die in pursuit of wealth, and birds die in pursuit of food!\n");
continue;
}
//cout << sum << endl;
t -= sum;
solve( , -);
printf("%d\n" , dp[][t]);
}
}
hdu4276 依赖背包的更多相关文章
- 【HDU 4276】The Ghost Blows Light(树形DP,依赖背包)
The Ghost Blows Light Problem Description My name is Hu Bayi, robing an ancient tomb in Tibet. The t ...
- hdu 1561 The more, The Better (依赖背包 树形dp)
题目: 链接:点击打开链接 题意: 非常明显的依赖背包. 思路: dp[i][j]表示以i为根结点时攻击j个城堡得到的最大值.(以i为根的子树选择j个点所能达到的最优值) dp[root][j] = ...
- hdoj1010Starship Troopers (树dp,依赖背包)
称号:hdoj1010Starship Troopers 题意:有一个军队n个人要占据m个城市,每一个城市有cap的驻扎兵力和val的珠宝,并且这m个城市的占率先后具有依赖关系,军队的每一个人能够打败 ...
- 依赖背包——cf855C好题
比较裸的依赖背包,但是想状态还是想了好久 转移时由于边界问题,虽然可以倒序转移,但当容量为0|1的时候,由于有初始值的存在 很难再原dp数组上进行修改,所以额外用tmp数组来保存修改后的值 #incl ...
- cf581F 依赖背包+临时数组 好题
这题得加个临时数组才能做.. /* 给定一棵树,树节点可以染黑白,要求叶子节点黑白平分 称连接黑白点的边为杂边,求使得杂边最少的染色方 那么设dp[i][j][0|1]表示i子树中有j个叶子节点,i染 ...
- poj1155 依赖背包
/* 依赖背包 dp[i][j]表示i结点为根的树选择j个用户时的最大剩余费用 即背包容量是j,价值是最大费用 */ #include<iostream> #include<cstr ...
- BZOJ.4182.Shopping(点分治/dsu on tree 树形依赖背包 多重背包 单调队列)
BZOJ 题目的限制即:给定一棵树,只能任选一个连通块然后做背包,且每个点上的物品至少取一个.求花费为\(m\)时最大价值. 令\(f[i][j]\)表示在点\(i\),已用体积为\(j\)的最大价值 ...
- BZOJ.4910.[SDOI2017]苹果树(树形依赖背包 DP 单调队列)
BZOJ 洛谷 \(shadowice\)已经把他的思路说的很清楚了,可以先看一下会更好理解? 这篇主要是对\(Claris\)题解的简单说明.与\(shadowice\)的做法还是有差异的(比如并没 ...
- hdu1561 树形dp,依赖背包
多重背包是某个物品可以选择多次,要把对物品数的枚举放在对w枚举外面 分组背包是某组的物品只能选一个,要把对每组物品的枚举放在对w枚举内侧 依赖背包是多层的分组背包,利用树形结构建立依赖关系,每个结点都 ...
随机推荐
- HTML - HTML基础篇
一.什么是html ? 超文本标记语言.HTML 是标记语言 历史版本: Html 4.01 1999年12月24日,w3c推荐标准 (老网站) 如今 是 html 5 版本. 1.Html 标签拥有 ...
- Android自定义控件三种方式
1.组合原生控件(继承自ViewGroup.LinearLayout.FrameLayout.RelativeLayout等) 将原生空间做组合,自定义一些事件 2.自己绘制控件(继承自View) ...
- mongoDB Liunx下安装及配置
以下以ubuntu 16.04(64位)操作系统为例: 一.下载和安装 在ubuntu下安装mongodb可以使用 apt-get进行安装,也可以直接下载编译好的二进制文件进行安装.下面主要介绍使用二 ...
- ansible 常见指令表
Play 指令 说明 accelerate 开启加速模式 accelerate_ipv6 是否开启ipv6 accelerate_port 加速模式的端口 always_run any_error ...
- EntityFramework之事务
一.EF事务 引用程序集 using System.Transactions; 用法 var writer = new System.IO.StringWriter(); try { using (v ...
- Statically Linking freeglut
It’s possible statically link freeglut into your applications, instead of dynamically linking agains ...
- ubuntu14.04上源码安装openssl1.0.2k
卸载自带openssl sudo apt-get remove openssl 解压文件tar -xzf openssl-1.0.2k.tar.gz 配置 sudo ./config shared - ...
- python获取esxi的磁盘使用率信息
#!/usr/bin/python3 #coding:utf-8 #Author: ziming """ 只用于模拟开发功能测试 """ f ...
- PHP随机红包算法
2017年1月14日 14:19:14 星期六 一, 整体设计 算法有很多种, 可以自行选择, 主要的"架构" 是这样的, 用redis decr()命令去限流, 用mysql去记 ...
- UML建模图
UML 2.0规范 迅速成为建立软件系统可视化.规范.文档的标准.统一建模语言(UML) 也被用于非软件系统的建模,并在很多领域,诸如金融,军事,工程方面应用广泛. UML 2 定义了13种基本的图, ...