对于软件的依赖可以转化为图上点之间的边的关系
发现对于一个强联通分量内的软件,一安则全安
Tarjan缩点
缩点后,从虚拟节点 0 向所有入度为 0 的点连边
这样就构成了一棵树
树形 dp
$dp[i][j]$ 表示对 $i$ 及其子树话费 $j$ 的价格所得到的收益
$dp[i][j] = dp[k][l] + dp[i][j - l]$

#include <bits/stdc++.h>

const int N = ;

int head[N], cnt;
struct Node {int u, v, nxt;};
int Tim, Bel[N], Low[N], Dfn[N], Stack[N], topp;
int W[N], V[N], Tw[N], Tv[N];
Node G[N];
int n, M;
bool vis[N];
int Gra; inline void Add(int u, int v) {G[++ cnt].v = v; G[cnt].nxt = head[u]; head[u] = cnt;} void Tarjan(int u) {
Dfn[u] = Low[u] = ++ Tim;
Stack[++ topp] = u, vis[u] = ;
for(int i = head[u]; ~ i; i = G[i].nxt) {
int v = G[i].v;
if(!Dfn[v]) {
Tarjan(v);
Low[u] = std:: min(Low[u], Low[v]);
} else if(vis[v]) Low[u] = std:: min(Low[u], Low[v]);
}
if(Low[u] == Dfn[u]) {
vis[u] = , Bel[u] = ++ Gra, Tw[Gra] += W[u], Tv[Gra] += V[u];
while(Stack[topp] != u) {
vis[Stack[topp]] = , Bel[Stack[topp]] = Gra, Tw[Gra] += W[Stack[topp]], Tv[Gra] += V[Stack[topp]];
topp --;
} topp --;
}
} int In[N], head_2[N];
Node E[N]; inline void Add2(int u, int v) {E[++ cnt].v = v, E[cnt].nxt = head_2[u], head_2[u] = cnt;} void Re_build() {
cnt = ;
for(int i = ; i <= Gra; i ++) head_2[i] = -;
for(int u = ; u <= n; u ++)
for(int i = head[u]; ~ i; i = G[i].nxt) {
int v = G[i].v;
if(Bel[u] != Bel[v]) Add2(Bel[u], Bel[v]), In[Bel[v]] = ;
}
} int f[N][N * ]; void Dfs(int u) {
for(int i = head_2[u]; ~ i; i = E[i].nxt) {
int v = E[i].v;
Dfs(v);
for(int j = M - Tw[u]; j >= ; j --)
for(int k = ; k <= j; k ++)
f[u][j] = std:: max(f[u][j], f[u][k] + f[v][j - k]);
}
for(int j = M; j >= ; j --) {
if(j >= Tw[u]) f[u][j] = f[u][j - Tw[u]] + Tv[u];
else f[u][j] = ;
}
} #define gc getchar() inline int read() {
int x = ; char c = gc;
while(c < '' || c > '') c = gc;
while(c >= '' && c <= '') x = x * + c - '', c = gc;
return x;
} int main() {
n = read(), M = read();
for(int i = ; i <= n; i ++) head[i] = -;
for(int i = ; i <= n; i ++) W[i] = read();
for(int i = ; i <= n; i ++) V[i] = read();
for(int i = ; i <= n; i ++) {
int u = read();
if(u) Add(u, i);
}
for(int i = ; i <= n; i ++) if(!Dfn[i]) Tarjan(i);
Re_build();
for(int i = ; i <= Gra; i ++) if(!In[i]) Add2(, i);
Dfs();
std:: cout << f[][M];
return ;
}

luogu 2515的更多相关文章

  1. Luogu 魔法学院杯-第二弹(萌新的第一法blog)

    虽然有点久远  还是放一下吧. 传送门:https://www.luogu.org/contest/show?tid=754 第一题  沉迷游戏,伤感情 #include <queue> ...

  2. luogu p1268 树的重量——构造,真正考验编程能力

    题目链接:http://www.luogu.org/problem/show?pid=1268#sub -------- 这道题费了我不少心思= =其实思路和标称毫无差别,但是由于不习惯ACM风格的题 ...

  3. [luogu P2170] 选学霸(并查集+dp)

    题目传送门:https://www.luogu.org/problem/show?pid=2170 题目描述 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实力相当的人中,一部分被选上,另一 ...

  4. [luogu P2647] 最大收益(贪心+dp)

    题目传送门:https://www.luogu.org/problem/show?pid=2647 题目描述 现在你面前有n个物品,编号分别为1,2,3,--,n.你可以在这当中任意选择任意多个物品. ...

  5. Luogu 考前模拟Round. 1

    A.情书 题目:http://www.luogu.org/problem/show?pid=2264 赛中:sb题,直接暴力匹配就行了,注意一下读入和最后一句话的分句 赛后:卧槽 怎么只有40 B.小 ...

  6. luogu P2580 于是他错误的点名开始了

    luogu  P2580 于是他错误的点名开始了 https://www.luogu.org/problem/show?pid=2580 题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 他会一边 ...

  7. CJOJ 1331 【HNOI2011】数学作业 / Luogu 3216 【HNOI2011】数学作业 / HYSBZ 2326 数学作业(递推,矩阵)

    CJOJ 1331 [HNOI2011]数学作业 / Luogu 3216 [HNOI2011]数学作业 / HYSBZ 2326 数学作业(递推,矩阵) Description 小 C 数学成绩优异 ...

  8. Luogu 1349 广义斐波那契数列(递推,矩阵,快速幂)

    Luogu 1349 广义斐波那契数列(递推,矩阵,快速幂) Description 广义的斐波那契数列是指形如\[A_n=p*a_{n-1}+q*a_{n-2}\]的数列.今给定数列的两系数p和q, ...

  9. Luogu 1962 斐波那契数列(矩阵,递推)

    Luogu 1962 斐波那契数列(矩阵,递推) Description 大家都知道,斐波那契数列是满足如下性质的一个数列: f(1) = 1 f(2) = 1 f(n) = f(n-1) + f(n ...

随机推荐

  1. Go语言学习笔记(6)——指针

    指  针 指针: 存储另一个变量的内存地址的变量: Go语言的取地址符号也是& 1. 声明指针: var needle_name *type var b int = 10 var a *int ...

  2. chrome 调试 ios h5

    1,安装itunes, 否则无法识别iphone设备 2,开启调试模式 ,打开 iPhone 依次进入 设置 > Safari > 高级 > Web 检查 > 启用 3,下载 ...

  3. This is very likely to create a memory leak. Stack trace of thread错误分析

    1.问题描述 启动tomcat部署项目时,报This is very likely to create a memory leak. Stack trace of thread错误. 29-May-2 ...

  4. ( 十二)Json的使用(上)

    一.什么是JSON 1.1 javaScript中定义对象的几种方式 使用内置对象 自定义对象构造 使用JSON符号  (1)使用内置对象 JavaScript可用的内置对象可分为两种: 1,Java ...

  5. datagrid使用和文字超出tip提示

    function LoadTable(queryData) {             $("#eventInfoTable").datagrid({               ...

  6. 多节点bigchaindb集群部署

    文章比较的长,安装下来大概4个小时左右,我个人使用的服务器,速度会快一点. 安装环境 ostname ip os node-admin 192.168.237.130 ubuntu 18.04.2 d ...

  7. 【原创】大叔经验分享(86)hive和mysql数据互导

    hive和mysql数据互导,首先想到的是sqoop,并且可以和调度框架(比如oozie等)配合配置定时任务,还有一种更简单的方式是通过spark-sql: CREATE OR REPLACE TEM ...

  8. 关于困惑已久的var self=this的解释

    首先说下this这个对象的由来(属于个人理解):每个函数在定义被ECMAScript解析器解析时,都会创建两个特殊的变量:this和arguments,换句话说,每个函数都有属于自己的this对象,这 ...

  9. [Lua性能] 小试验一例

    local s1 = os.clock() local list1 = {} , do list1[#list1 + ] = end local e1 = os.clock() print(" ...

  10. navicat 控制mysql某个数据库只属于某个用户

    1.使用navicat 1)首先使用root用户新建连接 2)新建mysql用户 3)点击权限,选择添加权限,出现MySQL中已存在的数据库列表,选择你要为该新建用户开放的数据库,此处选择“maiba ...