传送门

BZOJ 2427

题解

Tarjan把环缩成点,然后跑树形背包即可。

我用的树形背包是DFS序上搞的那种。

要注意dp数组初始化成-INF!

要注意dp顺推的时候也不要忘记看数组是否越界!

长太息以掩涕兮,

哀bug之难De...

#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <ctime>
using namespace std;
typedef long long ll;
#define enter putchar('\n')
#define space putchar(' ')
template <class T>
void read(T &x){
char c;
bool op = 0;
while(c = getchar(), c > '9' || c < '0')
if(c == '-') op = 1;
x = c - '0';
while(c = getchar(), c >= '0' && c <= '9')
x = x * 10 + c - '0';
if(op) x = -x;
}
template <class T>
void write(T x){
if(x < 0) putchar('-'), x = -x;
if(x >= 10) write(x / 10);
putchar('0' + x % 10);
} const int N = 105, M = 505, _INF = 0xc0c0c0c0;
int n, m, ans, _c[N], _w[N], c[N], w[N], fa[N], _adj[N], _nxt[N];
int dfn[N], low[N], idx, stk[N], top, bel[N], scc, cnt[N];
int adj[N], nxt[N], dp[N][M], sze[N], seq[N], tot;
bool ins[N];
void tarjan(int u){
dfn[u] = low[u] = ++idx;
stk[++top] = u, ins[u] = 1;
for(int v = _adj[u]; v; v = _nxt[v])
if(!dfn[v])
tarjan(v), low[u] = min(low[u], low[v]);
else if(ins[v])
low[u] = min(low[u], dfn[v]);
if(low[u] == dfn[u]){
++scc;
int v = 0;
while(v != u){
ins[v = stk[top--]] = 0;
bel[v] = scc, cnt[scc]++;
c[scc] += _c[v], w[scc] += _w[v];
}
}
}
void rebuild(){
static bool vis[N] = {0};
for(int i = 1; i <= n; i++)
if(cnt[bel[i]] > 1 && !vis[bel[i]])
nxt[bel[i]] = adj[0], adj[0] = bel[i], vis[bel[i]] = 1;
else if(cnt[bel[i]] == 1)
nxt[bel[i]] = adj[bel[fa[i]]], adj[bel[fa[i]]] = bel[i];
}
void dfs(int u){
seq[++tot] = u, sze[u] = 1;
for(int v = adj[u]; v; v = nxt[v])
dfs(v), sze[u] += sze[v];
}
int main(){
read(n), read(m);
for(int i = 1; i <= n; i++) read(_c[i]);
for(int i = 1; i <= n; i++) read(_w[i]);
for(int i = 1; i <= n; i++)
read(fa[i]), _nxt[i] = _adj[fa[i]], _adj[fa[i]] = i;
for(int i = 1; i <= n; i++)
if(!dfn[i]) tarjan(i);
rebuild();
dfs(0);
memset(dp, _INF, sizeof(dp));
dp[1][0] = 0;
for(int i = 1; i <= tot; i++){
for(int j = 0; j <= m; j++){
dp[i + sze[seq[i]]][j] = max(dp[i + sze[seq[i]]][j], dp[i][j]);
if(j + c[seq[i]] <= m)
dp[i + 1][j + c[seq[i]]] = max(dp[i + 1][j + c[seq[i]]], dp[i][j] + w[seq[i]]);
}
}
for(int j = 0; j <= m; j++)
ans = max(ans, dp[tot + 1][j]);
write(ans), enter;
return 0;
}

BZOJ 2427 [HAOI2010]软件安装 | 这道树形背包裸题严谨地证明了我的菜的更多相关文章

  1. BZOJ 2427: [HAOI2010]软件安装 tarjan + 树形背包

    Description 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和 ...

  2. bzoj 2427 [HAOI2010]软件安装 Tarjan缩点+树形dp

    [HAOI2010]软件安装 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2029  Solved: 811[Submit][Status][Dis ...

  3. 【BZOJ2427】[HAOI2010]软件安装 Tarjan+树形背包

    [BZOJ2427][HAOI2010]软件安装 Description 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为 ...

  4. HAOI2010软件安装(树形背包)

    HAOI2010软件安装(树形背包) 题意 有n个物品,每个物品最多会依赖一个物品,但一个物品可以依赖于一个不独立(依赖于其它物品)的物品,且可能有多个物品依赖一个物品,并且依赖关系可能形成一个环.现 ...

  5. 【bzoj2427】[HAOI2010]软件安装 Tarjan+树形背包dp

    题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大).但是现 ...

  6. bzoj 2427: [HAOI2010]软件安装

    Description 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和 ...

  7. [HAOI2010]软件安装(树形背包,tarjan缩点)

    题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大). 但是 ...

  8. BZOJ2427: [HAOI2010]软件安装 tarjan+树形背包

    分析: 一开始我以为是裸的树形背包...之后被告知这东西...可能有环...什么!有环! 有环就搞掉就就可以了...tarjan缩点...建图记得建立从i到d[i]之后跑tarjan,因为这样才能判断 ...

  9. bzoj 2427: [HAOI2010]软件安装【tarjan+树形dp】

    一眼最大权闭合子图,然后开始构图,画了画之后发现我其实是个智障网络流满足不了m,于是发现正确的打开方式应该是一眼树上dp 然后仔细看了看性质,发现把依赖关系建成图之后是个奇环森林,这个显然不能直接dp ...

随机推荐

  1. odoo之显示前端,数据,可选择

    def create(self,cr,uid,vals,context=None): if context is None: context ={} if vals.get('name','/')== ...

  2. 搭建HBase的本地模式、伪分布式、全分布式和HA模式

    一.安装HBase: 我这里选择的是hbase-1.3.1-bin.tar.gz版本解压HBase: tar -zxvf hbase-1.3.1-bin.tar.gz -C ~/training 配置 ...

  3. Regionserver启动后又关闭

    今天启动hbase shell,输入hbase命令时报错: ERROR [regionserver/regionserver1/172.18.0.61:16020] reggionserver.HRe ...

  4. 20155301 Web基础

    20155301 Web基础 1.基础问题回答 (1)什么是表单 答: 表单是一个包含表单元素的区域. 表单元素是允许用户在表单中(比如:文本域.下拉列表.单选框.复选框等等)输入信息的元素 (2)浏 ...

  5. Servlet——提交表单信息,Servlet之间的跳转

    HTML表单标签:<form></form> 属性: actoion:  提交到的地址,默认为当前页面 method:  表单提交方式 有get和post两种方式,默认为get ...

  6. python 回溯法 子集树模板 系列 —— 15、总结

    作者:hhh5460 时间:2017年6月3日 用回溯法子集树模板解决了这么多问题,这里总结一下使用回溯法子集树模板的步骤: 1.确定元素及其状态空间(精髓) 对每一个元素,遍历它的状态空间,其它的事 ...

  7. libgdx学习记录22——3d物体创建

    libgdx是一个强大的游戏框架,不仅支持2d部分,同时还支持3d部分. libgdx的3d部分投影主要通过PerspectiveCamera实现. 物体的显示过程: 1. 创建远景相机,角度一般设为 ...

  8. [UOJ#461]新年的Dog划分[二分图染色、二分]

    题意 给你一张无向连通图,你并不知道有哪些边,你首先要回答这张图是否是二分图,如果是,回答这张图黑白染色过后的任意一个点集.你需要在2000次询问内找到结果,每次你可以询问原图中一个边集删掉后是否还连 ...

  9. [BZOJ1135][POI2009]Lyz[霍尔定理+线段树]

    题意 题目链接 分析 这个二分图匹配模型直接建图的复杂度太高,考虑霍尔定理. 对于某些人组成的区间,我们只需要考虑他们的并是一段连续的区间的集合.更进一步地,我们考虑的人一定是连续的. 假设我们考虑的 ...

  10. 利用privoxy劫持http网站数据,插入广告,获取用户名,密码

    看了几篇privoxy的文章,感觉讲的都不详细,在此整理一遍. 注:本文下面的内容仅讨论思路,作为技术交流之用,请勿用作非法途径. Privoxy是一款带过滤功能的代理服务器,针对HTTP.HTTPS ...