[BZOJ 2427] 软件安装
Link:
Solution:
只看样例的话会以为是裸的树形$dp$……
但实际上题目并没有说明恰好仅有一个物品没有依赖项
因此原图可能由是由多棵树与多个图组成的
先跑一遍$tarjan$求出每个图中的$SCC$,缩点将原图转化为森林
再设置一个根,将森林转换成一棵树$dp$即可:$dp[i][j]=max\{ dp[i][k]+dp[son[i]][j-k]\}$
为了保证依赖条件满足,每棵子树的根都必须要选择,因此返回前还要再刷一遍:$dp[i][j]=dp[i][j-w_i]+v_i$
Tip:$dp$时要注意$k$也要逆序枚举,因为$w_i$可能为0
Code:
#include <bits/stdc++.h> using namespace std;
const int MAXN=;
struct edge{int nxt,to;}e[MAXN<<];
stack<int> st;
int f[MAXN],head[MAXN],in[MAXN],S;
int instack[MAXN],vis[MAXN],col[MAXN],dfn[MAXN],low[MAXN];
int n,m,x,dp[MAXN][MAXN],w[MAXN],v[MAXN],sw[MAXN],sv[MAXN],tot,cnt,idx; void add_edge(int from,int to)
{e[++tot].nxt=head[from];e[tot].to=to;head[from]=tot;} void tarjan(int x)
{
dfn[x]=low[x]=++idx;
instack[x]=vis[x]=true;st.push(x);
for(int i=head[x];i;i=e[i].nxt)
{
if(!vis[e[i].to])
tarjan(e[i].to),low[x]=min(low[x],low[e[i].to]);
else if(instack[e[i].to])
low[x]=min(low[x],low[e[i].to]);
}
if(dfn[x]==low[x])
{
int t=-;cnt++;
while(t!=x)
{
t=st.top();st.pop();
instack[t]=false;col[t]=cnt;
sw[cnt]+=w[t];sv[cnt]+=v[t];
}
}
} void dfs(int x,int anc)
{
for(int i=head[x];i;i=e[i].nxt)
{
if(e[i].to==anc) continue;
dfs(e[i].to,x);
for(int j=m-sw[x];j>=;j--)
for(int k=j;k>=;k--)//k也要保持逆序
dp[x][j]=max(dp[x][j],dp[x][k]+dp[e[i].to][j-k]);
}
for(int j=m;j>=;j--)
if(j>=sw[x]) dp[x][j]=dp[x][j-sw[x]]+sv[x];
else dp[x][j]=;
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d",&w[i]);
for(int i=;i<=n;i++) scanf("%d",&v[i]);
for(int i=;i<=n;i++)
{
scanf("%d",&f[i]);
if(f[i]) add_edge(f[i],i);
} for(int i=;i<=n;i++)//原图不一定连通
if(!vis[i]) tarjan(i); tot=;S=cnt+;
memset(head,,sizeof(head));
for(int i=;i<=n;i++)
if(f[i]&&col[i]!=col[f[i]])
add_edge(col[f[i]],col[i]),in[col[i]]++;
for(int i=;i<=cnt;i++)//建立根
if(!in[i]) add_edge(S,i); dfs(S,);
printf("%d",dp[S][m]); return ;
}
[BZOJ 2427] 软件安装的更多相关文章
- bzoj 2427 软件安装 - Tarjan - 树形动态规划
题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大). 但是 ...
- BZOJ 2427 软件安装(强连通分量+树形背包)
题意:现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大).但是现在有 ...
- bzoj 2427: [HAOI2010]软件安装
Description 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和 ...
- BZOJ 2427 [HAOI2010]软件安装 | 这道树形背包裸题严谨地证明了我的菜
传送门 BZOJ 2427 题解 Tarjan把环缩成点,然后跑树形背包即可. 我用的树形背包是DFS序上搞的那种. 要注意dp数组初始化成-INF! 要注意dp顺推的时候也不要忘记看数组是否越界! ...
- bzoj 2427 [HAOI2010]软件安装 Tarjan缩点+树形dp
[HAOI2010]软件安装 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2029 Solved: 811[Submit][Status][Dis ...
- BZOJ 2427: [HAOI2010]软件安装 tarjan + 树形背包
Description 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和 ...
- 【BZOJ-2427】软件安装 Tarjan + 树形01背包
2427: [HAOI2010]软件安装 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 960 Solved: 380[Submit][Status ...
- 【BZOJ2427】[HAOI2010]软件安装(动态规划,Tarjan)
[BZOJ2427][HAOI2010]软件安装(动态规划,Tarjan) 题面 BZOJ 洛谷 题解 看到这类题目就应该要意识到依赖关系显然是可以成环的. 注意到这样一个性质,依赖关系最多只有一个, ...
- [BZOJ2427][HAOI2010]软件安装(Tarjan+DP)
2427: [HAOI2010]软件安装 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1987 Solved: 791[Submit][Statu ...
随机推荐
- 【BZOJ】1954: Pku3764 The xor-longest Path
[算法]trie树+xor路径 [题解] 套路1:统计从根到每个点的xor路径和,由于xor的自反性,两个点到根的xor路径和异或起来就得到两点间路径和. 然后问题就是找到n个值中异或值最大的两个值, ...
- 深入浅出MyBatis:JDBC和MyBatis介绍
JDBC相关概念 Java程序都是通过JDBC连接数据库的,通过SQL对数据库编程,JDBC是由SUN公司提出的一些列规范,只定义了接口规范,具体实现由各个数据库厂商去实现,它是一种典型的桥接模式. ...
- [Unity]用PropertyDrawer自定义struct/class的外观
一般来说,当我们要扩展编辑器时,我们会从Editor类继承,为自己的MonoBehaviour实现不同的外观. 但是如果有一个struct/class,在许多地方被使用,Unity默认的外观又不够好看 ...
- NYOJ 1237 最大岛屿 (深搜)
题目链接 描述 神秘的海洋,惊险的探险之路,打捞海底宝藏,激烈的海战,海盗劫富等等.加勒比海盗,你知道吧?杰克船长驾驶着自己的的战船黑珍珠1号要征服各个海岛的海盜,最后成为海盗王. 这是一个由海洋. ...
- 集合框架源码学习之LinkedList
0-1. 简介 0-2. 内部结构分析 0-3. LinkedList源码分析 0-3-1. 构造方法 0-3-2. 添加add方法 0-3-3. 根据位置取数据的方法 0-3-4. 根据对象得到索引 ...
- C#数据没初始化,使用会报错,可以初始化null
protected void Page_Load(object sender, EventArgs e) { string[] A; if (B== 0) { A = new string[] {1, ...
- C 封装一个通用链表 和 一个简单字符串开发库
引言 这里需要分享的是一个 简单字符串库和 链表的基库,代码也许用到特定技巧.有时候回想一下, 如果我读书的时候有人告诉我这些关于C开发的积淀, 那么会走的多直啊.刚参加工作的时候做桌面开发, 服务是 ...
- 【LabVIEW技巧】工厂模式_简单工厂
前言 上一个文章介绍了如何学习LabVIEW OOP,简要的提及了一些OOP学习中注意的事项,许多文章的读者反映写的太范,后文会逐步缩小范围,讨论在LabVIEW中各个模式的应用. 工厂模式概述 工厂 ...
- jdbc简单小登陆demo
package com.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultS ...
- P2511 [HAOI2008]木棍分割
目录 Description Solution Code Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, ...