如果依赖关系出现环,那么对于一个环里的点,要么都选要么都不选,

所以每个环可以当成一个点,也就是强连通分量

然后就可以构造出一颗树,然后树形背包瞎搞一下就行了

注意要搞一个虚拟节点当根节点

Code

#include <cstdio>
#include <algorithm>
#include <cstring>
#define N 2010
using namespace std; struct info{int to,nex;}e[N],ne[N];
int n,m,w[N],v[N],tot,head[N],d[N],in[N];
int dfn[N],low[N],scc,tp,sta[N],bl[N],wei[N],val[N],dp[N][N];
bool inq[N]; void Link(int u,int v){
e[++tot].nex=head[u];head[u]=tot;e[tot].to=v;
} inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
} void tarjan(int u){
dfn[u]=low[u]=++tot;
sta[++tp]=u,inq[u]=1;
for(int i=head[u],v;i;i=e[i].nex)
if(!dfn[v=e[i].to]) tarjan(v),low[u]=min(low[u],low[v]);
else if(inq[v]) low[u]=min(low[u],dfn[v]);
if(dfn[u]==low[u]){
++scc;
for(int v=0;v!=u;)inq[v=sta[tp--]]=0,bl[v]=scc;
}
} void DP(int u){
for(int i=wei[u];i<=m;++i) dp[u][i]=val[u];
for(int i=head[u],v;i;i=e[i].nex){
DP(v=e[i].to);
for(int j=m-wei[u];j>=0;--j)
for(int k=0;k<=j;++k)
dp[u][j+wei[u]]=max(dp[u][j+wei[u]],dp[u][j+wei[u]-k]+dp[v][k]);
}
} int main(){
n=read(),m=read();
for(int i=1;i<=n;w[i++]=read());
for(int i=1;i<=n;v[i++]=read());
for(int i=1;i<=n;++i) if(d[i]=read()) Link(d[i],i);
tot=0;
for(int i=1;i<=n;++i) if(!dfn[i]) tarjan(i);
tot=0,memset(head,0,sizeof(head)),memset(e,0,sizeof(e));
for(int i=1;i<=n;++i){
wei[bl[i]]+=w[i],val[bl[i]]+=v[i];
if(bl[i]!=bl[d[i]]&&d[i]) Link(bl[d[i]],bl[i]),in[bl[i]]++;
}
++scc;
for(int i=1;i<scc;++i) if(!in[i]) Link(scc,i);
DP(scc);
printf("%d\n",dp[scc][m]);
return 0;
}

[BZOJ2427][HAOI2010]软件安装(tarjan+树形DP)的更多相关文章

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

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

  2. BZOJ_2427_[HAOI2010]软件安装_tarjan+树形DP

    BZOJ_2427_[HAOI2010]软件安装_tarjan+树形DP 题意: 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁 ...

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

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

  4. 【BZOJ2427】[HAOI2010]软件安装 Tarjan+树形背包

    [BZOJ2427][HAOI2010]软件安装 Description 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为 ...

  5. 【BZOJ-2427】软件安装 Tarjan + 树形01背包

    2427: [HAOI2010]软件安装 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 960  Solved: 380[Submit][Status ...

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

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

  7. 【bzoj2427】[HAOI2010]软件安装 Tarjan+树形背包dp

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

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

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

  9. BZOJ 2427: [HAOI2010]软件安装 tarjan + 树形背包

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

随机推荐

  1. SASS简介及使用方法

    一.什么是Sass Sass (Syntactically Awesome StyleSheets)是css的一个扩展开发工具,它允许你使用变量.条件语句等,使开发更简单可维护.这里是官方文档. 二. ...

  2. svg的基本图形与属性【小尾巴的svg学习笔记1】

    因为项目有可能用到, 所以学习了一下,做此笔记,图截自慕课网,侵删. 一.基本图形 1.矩形 x,y定义矩形的左上角坐标: width,height定义矩形的长度和宽度: rx,ry定义矩形的圆角半径 ...

  3. SQLServer:执行计划

    http://www.cnblogs.com/kissdodog/category/532309.html

  4. Jmeter入门6 参数化—CSV Data Set Config 通过文件导入数据

    线程组循环次数大于1的时候,请求里每次提交的数据都相同.有的系统限制了不能提交相同数据,我们通过 CSV Data Set Config 加载csv文件数据. 1 创建一个文本文件,输入参数值保存为. ...

  5. RF脚本中的坑1: SyntaxError: invalid token

    话不多说,直接上调试脚本: 执行后${b}=8:没问题.然后${a}改成08继续: 执行后居然报错了: 经过多次尝试08或者09时,都会报SyntaxError错误:后来查阅语法,才恍然大悟:Pyth ...

  6. DP,得到最多苹果,(POJ2385)

    题目链接:http://poj.org/problem?id=2385 题意: 牛在两棵苹果树下收集苹果,牛只能在这两棵树之间走动w次,在t时刻,某棵树会掉下苹果. 解题报告: ///dp[t][w] ...

  7. 网格中的BFS,逆向(POJ2049)

    题目链接:http://poj.org/problem?id=2049 解题报告: 网格中的BFS,最主要的是边界问题. 1.这里在左右,上下两个方向上,分别判断墙,和门,细节是,向上有t个墙,for ...

  8. 关于VMware给系统分区扩容的一点经验

    我的VMware版本是8.0.6 build-1035888,里面安装的是Windows XP SP3 首先,在VM关机状态下使用Hard disk设置中的Utilities下的Expand给整个磁盘 ...

  9. linq 和lambda查询

    EF 查询的两种 写法. linq 方法 或者 lambda方法 其中 ,只有tolist()的时候,才会真正的 在数据库中执行. 如果没有 tolist 方法,那么province1是 iqueab ...

  10. matlab 下载

    Obrazy DVD programu Matlab ke stažení Verze 2015b Verze 2015a Verze 2014b Verze 2014a Verze 2012b Ve ...