软件构成了一些树和一些环, 对于环我们要不不选, 要么选整个环. 跑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对象复制

    一,a和b都指向同一个对象,改变其中一个另一个也会改变 package com.ciaos; class Human{ public Human(String string, int i) { // ...

  2. find the most comfortable road(并差集,找差值最小的权值)

    find the most comfortable road Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  3. 淘特房产CMS系统 7.5

    资源描写叙述: 淘特房产CMS系统採用淘特AspCms开发,全部前台信息生成静态HTM,提供了楼盘.二手房.房产中介.房产经济人.业主社区等管理模块,集成了淘特CMS与动网论坛,Discuz,Oblo ...

  4. 远程登录 Windows server 2008 黑屏

    scenerio:  远程登录 Windows server 2008 黑屏,别人那里一切正常. Solution:在黑屏界面,点击桌面,按住Ctrl+Alt+End键 -> Log Off. ...

  5. 基于maven插件的缓存控制插件

    asset-cache-control github源码及下载地址: https://github.com/StruggleBird/asset-cache-control 基于maven插件的缓存控 ...

  6. Java学习之位运算和逻辑运算符

    今天看了一下HashMap类的源码,在HashMap的源码中定义了初始空间的大小 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; 当 ...

  7. Vmware中Ubuntu挂ISO到虚拟光驱

    Ubuntu 下挂ISO到虚拟光驱的方法 https://i.cnblogs.com/EditPosts.aspx?opt=1 如果要ubuntu找到rpm软件包,需要把iso挂载到/media/cd ...

  8. BZOJ 1567: [JSOI2008]Blue Mary的战役地图( 二分答案 + hash )

    二分答案, 然后用哈希去判断... ------------------------------------------------------------------------- #include ...

  9. ThinkPHP第七天(F函数使用,项目分组配置,项目分组模板文件放置规则配置)

    1.F(文件名称,写入数据,写入地址),用于将数据写入至磁盘文件中,如F('Data',$arr,'./Data/'),作用是将$arr写入至网站根目录的Data文件夹中的Data.php中. 2.读 ...

  10. VM VirtualBox安装Centos6.5

    · · 参考资料:http://www.jb51.net/os/239738.html 如果安装图形界面,内存分配要大于628M 和下图安装选项无关,1.2都可以 界面说明: Install or u ...