软件构成了一些树和一些环, 对于环我们要不不选, 要么选整个环. 跑tarjan缩点后, 新建个root, 往每个入度为0的点(强连通分量) 连边, 然后跑树dp( 01背包 )

----------------------------------------------------------------------------

#include<cstdio>
#include<cstring>
#include<stack>
#include<algorithm>
#include<vector>
#include<iostream>
  
#define rep(i, n) for(int i = 0; i < n; i++)
#define clr(x, c) memset(x, c, sizeof(x))
#define Rep(i, n) for(int i = 1; i <= n; ++i)
  
using namespace std;
 
const int maxn = 109, maxm = 509;
 
vector<int> G[maxn];
stack<int> S;
int dfn[maxn], low[maxn], scc[maxn], dfs_clock = 0, N = 0, n, m;
int W[maxn], V[maxn], w_t[maxn], v_t[maxn], d[maxn][maxm];
bool F[maxn];
 
void tarjan(int x) {
dfn[x] = low[x] = ++dfs_clock;
S.push(x);
for(vector<int>::iterator it = G[x].begin(); it != G[x].end(); it++)
if(!dfn[*it]) {
tarjan(*it);
low[x] = min(low[x], low[*it]);
} else if(!scc[*it])
low[x] = min(low[x], dfn[*it]);
if(low[x] == dfn[x]) {
N++;
int t;
do {
t = S.top(); S.pop();
scc[t] = N;
w_t[N] += W[t];
v_t[N] += V[t];
} while(t != x);
}
}
void TARJAN() {
clr(w_t, 0), clr(v_t, 0);
clr(scc, 0), clr(dfn, 0);
Rep(i, n) if(!dfn[i]) tarjan(i);
}
 
struct edge {
int to;
edge* next;
} E[maxn << 2], *pt = E, *head[maxn];
 
inline void add_edge(int u, int v) {
F[pt->to = v] = true;
pt->next = head[u];
head[u] = pt++;
}
 
void build() {
clr(F, 0), clr(head, 0);
Rep(i, n) 
   for(vector<int>::iterator it = G[i].begin(); it != G[i].end(); it++)
       if(scc[*it] != scc[i]) add_edge(scc[i], scc[*it]);
Rep(i, N) if(!F[i])
   add_edge(0, i);
}
 
void dp(int x) {
for(int i = v_t[x]; i <= m; i++) d[x][i] = w_t[x];
for(edge* e = head[x]; e; e = e->next) {
dp(e->to);
for(int h = m; h >= v_t[x]; h--)
   for(int t = 0; t <= h - v_t[x]; t++) 
   d[x][h] = max(d[x][h], d[x][h - t] + d[e->to][t]);
}
}
 
int main() {
// freopen("test.in", "r", stdin);
cin >> n >> m;
Rep(i, n) scanf("%d", V + i);
Rep(i, n) scanf("%d", W + i);
Rep(i, n) {
int v;
scanf("%d", &v);
if(v) G[v].push_back(i);
}
TARJAN();
build();
clr(d, 0), dp(0);
cout << *max_element(d[0], d[0] + m + 1) << "\n";
return 0;
}

----------------------------------------------------------------------------

BZOJ 2427: [HAOI2010]软件安装( dp )的更多相关文章

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

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

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

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

  3. BZOJ 2427 [HAOI2010]软件安装 | 这道树形背包裸题严谨地证明了我的菜

    传送门 BZOJ 2427 题解 Tarjan把环缩成点,然后跑树形背包即可. 我用的树形背包是DFS序上搞的那种. 要注意dp数组初始化成-INF! 要注意dp顺推的时候也不要忘记看数组是否越界! ...

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

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

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

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

  6. [BZOJ2427][HAOI2010]软件安装(Tarjan+DP)

    2427: [HAOI2010]软件安装 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1987  Solved: 791[Submit][Statu ...

  7. bzoj2427:[HAOI2010]软件安装(Tarjan+tree_dp)

    2427: [HAOI2010]软件安装 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1053  Solved: 424[Submit][Statu ...

  8. BZOJ_2427_[HAOI2010]软件安装_tarjan+树形DP

    BZOJ_2427_[HAOI2010]软件安装_tarjan+树形DP 题意: 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁 ...

  9. Tarjan+树形DP【洛谷P2515】[HAOI2010]软件安装

    [洛谷P2515][HAOI2010]软件安装 题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得 ...

随机推荐

  1. GCD自己做的一些简单总结

    GCD总结 GCD  Grand Central Dispatch  牛逼的中枢调度器 GCD中各种队列的执行效果 想看线程  必须是异步函数  并且不是主队列 注意:使用sync函数往当前串行队列添 ...

  2. Android ScrollView嵌套HorizontalScrollView 滑动问题 ScrollView包括GridView显示问题

    今天项目使用到ScrollView嵌套HorizontalScrollView,ScrollView里包括GridView,发现几个问题非常经典.在此记录: 问题1.ScrollView嵌套Horiz ...

  3. DevExpress ASP.NET 使用经验谈(4)-CriteriaOperator的使用

    上一节中,我们已经介绍了,使用CriteriaOperator表达式,获取对象数据. CriteriaOperator criteria = CriteriaOperator.Parse(" ...

  4. HTML之标签

    一.HTML 标签 HTML 标记标签通常被称为 HTML 标签 (HTML tag). •HTML 标签是由尖括号包围的关键词,比如 <html> •HTML 标签通常是成对出现的,比如 ...

  5. Flash Builder常用快捷键

    红色为常用 Ctrl-Shift-O - Organize imports,去除无用的导入类 Ctrl+F11 - 运行(在浏览器浏览) F11 - 调试 Alt+/ - 内容辅助 Ctrl+Alt+ ...

  6. 【转】从底层了解ASP.NET体系结构

    从底层了解ASP.NET体系结构 原文:http://blog.csdn.net/zhoufoxcn/article/details/1890158 Java体系架构的书多如牛毛,比如SSH架构什么的 ...

  7. 进度记录 和 安装imagick时Cannot locate header file MagickWand.h错误的解决

    修改php.ini文件,已使php支持扩展的功能 [root@localhost imagick-2.2.2]# ./configure --with-php-config=/usr/local/ph ...

  8. 玩2k16

    2k是我最喜欢的游戏啦,平时无聊了都会搞两盘.现在到2k16了,玩游戏时碰到一些麻烦,记录便查. 我哥一直说他的电脑玩2K16非常卡,根本玩不了,但是他的电脑配置可比我的高啊,我玩起溜溜地,喊他把配置 ...

  9. office2013破解工具

    终于找到破解工具了,每次打开word文档都弹出限期激活对话框,真的是相当烦躁啊,先把破解工具奉上!!!! 工具名: HEU-KMS-ActivatorV1.1绿色版 链接: office2013 和 ...

  10. 移动平台WEB前端开发技巧汇总(转)

    最近我很关注移动前端的知识,但做为一个UI设计师和web前端工作人员没有这个工作环境接触,做为门外汉,网上系统的知识也了了,一直有种雾里看花的感觉,见到本文,我自己是奉为经典.所以我分享之后又专门打笔 ...