【BZOJ2427】[HAOI2010]软件安装(动态规划,Tarjan)

题面

BZOJ

洛谷

题解

看到这类题目就应该要意识到依赖关系显然是可以成环的。

注意到这样一个性质,依赖关系最多只有一个,因此环状的依赖关系一定单独成环,其他点只可能将这个环作为依赖。

那么不成环的话,因为依赖关系只有一个,所以必定成树。

那么如果我们把所有环也给理解为一个单点的话,那么就是有一片森林,做一个树型背包即可。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
#define MAX 150
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
struct Line{int v,next;}e[MAX<<2];
int h[MAX],cnt=1,dg[MAX];
inline void Add(int u,int v){e[cnt]=(Line){v,h[u]};h[u]=cnt++;dg[v]++;}
int dfn[MAX],low[MAX],tim,top,St[MAX],ins[MAX];
int n,m,V[MAX],W[MAX],nvis[MAX],ans;
void Tarjan(int u)
{
dfn[u]=low[u]=++tim;St[++top]=u;ins[u]=1;
for(int i=h[u];i;i=e[i].next)
{
int v=e[i].v;
if(!dfn[v])Tarjan(v),low[u]=min(low[u],low[v]);
else if(ins[v])low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u])
{
int sw=0,sv=0,v,sz=0;
do
{
v=St[top--];sw+=W[v],sv+=V[v];ins[v]=0;W[v]=V[v]=0;nvis[v]=1;++sz;
if(u!=v)
for(int i=h[v];i;i=e[i].next)
Add(u,e[i].v);
}while(u!=v);
W[u]=sw;V[u]=sv;if(sz>1)dg[u]=0;nvis[u]=0;
}
}
int f[MAX][505],sw[MAX],tmp[505];
void dfs(int u)
{
if(W[u]<=m)f[u][W[u]]=V[u];sw[u]=W[u];nvis[u]=true;
for(int i=h[u];i;i=e[i].next)
{
int v=e[i].v;if(nvis[v])continue;
dfs(v);
for(int j=0;j<=m&&j<=sw[u]+sw[v];++j)tmp[j]=-1e9;
for(int j=0;j<=sw[u];++j)
for(int k=0;k<=sw[v]&&j+k<=m;++k)
tmp[j+k]=max(tmp[j+k],f[u][j]+f[v][k]);
sw[u]+=sw[v];
for(int j=0;j<=m&&j<=sw[u];++j)f[u][j]=max(f[u][j],tmp[j]);
}
f[u][0]=0;
}
int main()
{
n=read();m=read();
for(int i=1;i<=n;++i)W[i]=read();
for(int i=1;i<=n;++i)V[i]=read();
for(int i=1;i<=n;++i)
{
int x=read();
if(x)Add(x,i);
}
for(int i=1;i<=n;++i)if(!dfn[i])Tarjan(i);
for(int i=1;i<=n;++i)if(!dg[i])Add(0,i);
memset(f,-63,sizeof(f));dfs(0);
for(int i=0;i<=m;++i)ans=max(ans,f[0][i]);
printf("%d\n",ans);
return 0;
}

【BZOJ2427】[HAOI2010]软件安装(动态规划,Tarjan)的更多相关文章

  1. [BZOJ2427][HAOI2010]软件安装(Tarjan+DP)

    2427: [HAOI2010]软件安装 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1987  Solved: 791[Submit][Statu ...

  2. bzoj2427:[HAOI2010]软件安装(Tarjan+tree_dp)

    2427: [HAOI2010]软件安装 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1053  Solved: 424[Submit][Statu ...

  3. [HAOI2010]软件安装(Tarjan,树形dp)

    [HAOI2010]软件安装 题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可 ...

  4. bzoj2427: [HAOI2010]软件安装

    Description 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和 ...

  5. BZOJ2427:[HAOI2010]软件安装(树形DP,强连通分量)

    Description 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和 ...

  6. 题解【bzoj2427 [HAOI2010]软件安装】

    Description 现在我们的手头有\(N\)个软件,对于一个软件\(i\),它要占用\(W_i\)的磁盘空间,它的价值为\(V_i\).我们希望从中选择一些软件安装到一台磁盘容量为\(M\)计算 ...

  7. [BZOJ2427]:[HAOI2010]软件安装(塔尖+DP)

    题目传送门 题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用${W}_{i}$的磁盘空间,它的价值为${V}_{i}$.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件 ...

  8. [bzoj2427][HAOI2010]软件安装——强连通分量+树形DP

    题目大意 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大). 但是 ...

  9. [BZOJ2427][HAOI2010]软件安装-tarjan缩点-树上dp

    <题面> 这个题真伤人 之前Tarjan和树规都没学好,吃了不少亏,仔仔细细的搞了一天,收获颇丰 先来一个Tarjan的链接:$\mathbb{O}$ 题目的数据比较友好: $dp$不对: ...

  10. BZOJ2427: [HAOI2010]软件安装 tarjan+树形背包

    分析: 一开始我以为是裸的树形背包...之后被告知这东西...可能有环...什么!有环! 有环就搞掉就就可以了...tarjan缩点...建图记得建立从i到d[i]之后跑tarjan,因为这样才能判断 ...

随机推荐

  1. VB6 变量定义作用域的一个奇特形式

    C#或JAVA 下面的i定义是只会限定在if 条件块里的: if (1 == 2) { int i = 000; } else { i = 111;// 错误,未定义. } i = 222;//错误 ...

  2. odoo11 添加自定义模块报错问题

    在昨天解决了数据库管理页面布局混乱的问题之后,如何设置自己的custom_addons模块文件夹成了主要问题,建立自己的custom_addons文件夹,可以使用git命令来管理自己所写代码的版本了, ...

  3. 你真的了解volatile关键字吗?

    volatile关键字经常在并发编程中使用,其特性是保证可见性以及有序性,但是关于volatile的使用仍然要小心,这需要明白volatile关键字的特性及实现的原理,这也是本篇文章的主要内容. 一. ...

  4. LVS负载均衡-基础知识梳理

    一. 集群的概念 服务器集群简称集群是一种服务器系统,它通过一组松散集成的服务器软件和/或硬件连接起来高度紧密地协作完成计算工作.在某种意义上,他们可以被看作是一台服务器.集群系统中的单个服务器通常称 ...

  5. centos6.5虚拟机安装后,没有iptables配置文件

    openstack环境里安装centos6.5系统的虚拟机,安装好后,发现没有/etc/syscofig/iptables防火墙配置文件. 解决办法如下: [root@kvm-server005 ~] ...

  6. windows如何查看电脑开关机记录

    如何查看电脑开关机记录 (一)如果你只是想查看一下,从昨天关机到今天开机之间有没有人使用我的计算机,在“开始”菜单的运行”中输入“eventvwr.msc”,或者是按下"开始菜单" ...

  7. 第三周Linux学习报告

    Linux内核源代码简介: arch/x86中内容重点关注 init目录重要,内核启动相关的代码基本上都在init目录下.如main.c等.Start_kernel函数相当于普通C程序的main函数. ...

  8. Entity Framwork学习笔记

    一.First Demo

  9. .NET中的许可证机制--License

    .NET中的许可证机制主要类:System.ComponentModel.License(为所有许可证提供 abstract 基类.向组件的特定实例授予许可证)     System.Componen ...

  10. 软件工程_7th weeks

    内聚和耦合(学习笔记) 一.内聚 内聚是一个模块内部各成分之间相关联程度的度量.把内聚按紧密程度从低到高排列次序为: 1.偶然内聚:指一个模块内各成分为完成一组功能而组合在一起,它们相互之间即使有关系 ...