软件构成了一些树和一些环, 对于环我们要不不选, 要么选整个环. 跑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. Gimp制作圆角透明图片

    用蒙版制作圆角透明图片,步骤如下: 1,用Gimp(2.8版本)打开图片 2,在图层窗口右键当前图层创建蒙版 3,选择蒙版类型黑色(全透明) 4,结果如下 5,用圆角矩形选择工具选择图片,设置圆角半径 ...

  2. 为《31天成为IT服务达人》征求正式名字

    写书时.没细想书的名字,仅仅是在想出本能够让同行或未来同行高速入门的书,如今想来还是应正式给他取个名,请朋友们帮忙哟

  3. 开始QT+OpenCV学问

    最近一个月.由于超声造影软件工具做.因此,开始接触OpenCV.使用OpenCV的话.除了图像处理,其它功能都非常弱.所以又開始学习MFC. 从原先的.net C#编程环境一下变成MFC还真有点不习惯 ...

  4. 概率图模型(PGM)学习笔记(四)-贝叶斯网络-伯努利贝叶斯-多项式贝叶斯

    之前忘记强调了一个重要差别:条件概率链式法则和贝叶斯网络链式法则的差别 条件概率链式法则 贝叶斯网络链式法则,如图1 图1 乍一看非常easy认为贝叶斯网络链式法则不就是大家曾经学的链式法则么,事实上 ...

  5. eclipse主题插件

    打开eclipse ,选择 Help 选择Install New Software 点击 Add 输入http://eclipse-color-theme.github.com/update,选中Ec ...

  6. 改变status bar的状态

    两种改变status bar状态的方法 一 :(全局的) 直接在当前控制器中(一般是在navigationcontroller) //- (UIStatusBarStyle)preferredStat ...

  7. D - D 田忌赛马

    D - D    田忌赛马   解题报告 hdu 1052 Tian Ji -- The Horse Racing 链接:http://acm.hust.edu.cn/vjudge/contest/v ...

  8. VMware: linux起步提示 memory for crashkernel(0*0 to 0*0)not within permissible

    (virtualbox/VMware)linux起步提示memoryforcrashkernel(0*0 to 0*0)notwithinpermissible  http://www.myexcep ...

  9. [lua]笔试-按字典序列出指指定的序列的位置

    计算方法: n的阶乘记为f(n), s为输入序列, sub(i)为s的i到n的子序列.A(i)为第i位对应的字母在子序列sub(i)中的字典顺序 N(s) = sum_{1,n} T(i)*(A(i) ...

  10. 链接分析算法之:主题敏感PageRank

    链接分析算法之:主题敏感PageRank     前面的讨论提到.PageRank忽略了主题相关性,导致结果的相关性和主题性降低,对于不同的用户,甚至有很大的差别.例如,当搜索“苹果”时,一个数码爱好 ...