软件构成了一些树和一些环, 对于环我们要不不选, 要么选整个环. 跑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. java代码发送JSON格式的httpPOST请求

    package com.test; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOE ...

  2. 【剑指offer】面试题43:n个骰子的点数

    第一种思路是,每一个骰子的点数从最小到最大,如果为1-6,那么全部的骰子从最小1開始,我们如果一种从左向右的排列,右边的最低,索引从最低開始,推断和的情况. def setTo1(dices, sta ...

  3. JS 排列组合

    function $CL(arr, n, noLC, arrDan) { //从arr中取n个组合,然后 var r = [], sum = 0; n = n - arrDan.length; (fu ...

  4. Android中图片处理相关问题

    在Android的开发中,我们经常回去处理一些图片相关的问题,比如当加载图片到内存中产生的OOM(OutOfMemory)异常.图片加载到内存中占多大内存的问题.jpg png两种常见的图片的原理及区 ...

  5. 2013 Changsha Regional 一样的木板一样的气球

    气球:      木板:   比赛现场: 场外: 曲线....  除了第一题出的太慢了,总体比成都好了很多.... 自此,今年两铜收场,再接再厉,明年要有更好的成绩.

  6. JBPM6教程

    JBPM6教程-手把手教你安装JBPM 1. 安装JBPM的先决条件: (1)JDK 1.6+以上,没有安装的话,猛击这里. (2)Ant 1.7+以上,没有安装的话,看看这里. 2. 下载JBPM安 ...

  7. 解决phpmyadmin配置文件的权限问题

    如果部署的phpmyadmin权限为所有人可写,即权限为777,就会报”Wrong permissions on configuration file, should not be world wri ...

  8. C语言之辗转相除法

    最大公约数和最小公倍数 从键盘输入两个正整数,求出其最大公约数和最小公倍数.代码如下: #include<stdio.h>int ss(int);int main(void){ int a ...

  9. shell学习之变量、判断、重复动作

    1.1 环境以及变量的定义.赋值.展开.删除 export:将一个变量导入到环境中:export PATH=$PATH:/home. readonly 讲一个变量设置为只读模式,在shell脚本中定义 ...

  10. Mac平台编译mupdf-qt的开源项目

    How to compile mupdf-qt Compile on Linux Install tools and thirdparty libraries You should install s ...