无力吐槽……

原题:

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

但是现在有个问题:软件之间存在依赖关系,即软件i只有在安装了软件j(包括软件j的直接或间接依赖)的情况下才能正确工作(软件i依赖软件j)。幸运的是,一个软件最多依赖另外一个软件。如果一个软件不能正常工作,那么它能够发挥的作用为0。

我们现在知道了软件之间的依赖关系:软件i依赖软件Di。现在请你设计出一种方案,安装价值尽量大的软件。一个软件只能被安装一次,如果一个软件没有依赖则Di=0,这时只要这个软件安装了,它就能正常工作。

0<=N<=100, 0<=M<=500

恩这道题刚开始的时候我是有思路的,就是树上有限制的背包嘛

但是为了防止写了数h+然后发现思路歪了还是去看了一下题解,然后才发现题中可以有环

环之间相互依赖,要选一个则其它必选,就可以直接看成一个点

然后就是tarjian缩强连通分量辣(环也是强连通分量

但是晚上调了1h+,知道错误在哪里但是怎么都想不明白为什么,因为很晚了急着走所以就去网上对着AC代码改程序过掉了,然而依旧不能想明白为什么,电脑关机一下错误的代码也没有了,心好累,感觉应该想不明白这个问题了

代码:

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int oo=;
int rd(){int z=,mk=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')mk=-; ch=getchar();}
while(ch>=''&&ch<=''){z=(z<<)+(z<<)+ch-''; ch=getchar();}
return z*mk;
}
struct ddd{int nxt,y;}e[]; int lk[],ltp=,indgr[];
inline void ist(int x,int y){ e[++ltp].nxt=lk[x],lk[x]=ltp,e[ltp].y=y,++indgr[y];}
int n,m;
int w[],v[];
int dfn[],low[],dfscnt=;
int stck[],tp=; bool vstd[];
int grp[],grpcnt=;
int f[][];
bool flg[];
void tj(int x){
flg[x]=true;
dfn[x]=low[x]=++dfscnt;
stck[++tp]=x,vstd[x]=true;
for(int i=lk[x];i;i=e[i].nxt){
if(!dfn[e[i].y]){ tj(e[i].y); low[x]=min(low[x],low[e[i].y]);}
else if(vstd[e[i].y]) low[x]=min(low[x],dfn[e[i].y]);
}
if(dfn[x]==low[x]){
++grpcnt; int tmp;
do{ tmp=stck[tp--],vstd[tmp]=false,grp[tmp]=grpcnt+n;}while(tmp!=x);
}
}
void dfs(int x){
for(int i=lk[x];i;i=e[i].nxt){
dfs(e[i].y);
for(int j=m;j>=;--j)for(int k=j;k>=;--k)
f[x][j]=max(f[x][j],f[x][j-k]+f[e[i].y][k]);
}
for(int i=m;i>=w[x];--i) f[x][i]=f[x][i-w[x]]+v[x];
for(int i=;i<w[x];++i) f[x][i]=;
}
int main(){//freopen("ddd.in","r",stdin);
memset(vstd,,sizeof(vstd));
memset(f,,sizeof(f));
memset(flg,,sizeof(flg));
cin>>n>>m;
for(int i=;i<=n;++i) w[i]=rd();
for(int i=;i<=n;++i) v[i]=rd();
for(int i=;i<=n;++i) ist(rd(),i);
for(int i=;i<=n;++i)if(!dfn[i]) tj(i);
for(int i=;i<=n;++i){
w[grp[i]]+=w[i],v[grp[i]]+=v[i];
for(int j=lk[i];j;j=e[j].nxt)if(grp[e[j].y]!=grp[i])
ist(grp[i],grp[e[j].y]);
}
for(int i=;i<=grpcnt;++i)if(!indgr[i+n]) ist(grpcnt+n+,i+n);
dfs(grpcnt+n+);
int mx=;
for(int i=;i<=m;++i) mx=max(mx,f[grpcnt+n+][i]);
cout<<mx<<endl;
return ;
}

【BZOJ2427】【HAOI2010】软件安装的更多相关文章

  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. bzoj2427: [HAOI2010]软件安装

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

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

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

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

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

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

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

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

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

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

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

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

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

  10. [BZOJ2427][HAOI2010]软件安装(tarjan+树形DP)

    如果依赖关系出现环,那么对于一个环里的点,要么都选要么都不选, 所以每个环可以当成一个点,也就是强连通分量 然后就可以构造出一颗树,然后树形背包瞎搞一下就行了 注意要搞一个虚拟节点当根节点 Code ...

随机推荐

  1. 动手动脑(Java)

    1.仔细阅读示例: EnumTest.java,运行它,分析运行结果? 你能得到什么结论?你掌握了枚举类型的基本用法了吗? 答: public class EnumTest { public stat ...

  2. Java并发编程_wait/notify和CountDownLatch的比较(三)

     1.wait/notify方法 package sync; import java.util.ArrayList; import java.util.List; public class WaitA ...

  3. C++构造函数和析构函数,以及构造函数特殊成员变量和函数的初始化

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  4. loadrunner json中文无法识别问题

    http://blog.sina.com.cn/s/blog_6ff7a3b50101awmy.html

  5. UNICODE_STRING(用户模式 内核模式)

    UNICODE_STRING结构: typedef struct  _UNICODE_STRING { USHORT Length;                                   ...

  6. python笔记2-变量

    变量 存东西所用 #定义变量 name='feifei'#定义变量,字符串 age=18.9#整型或者小数定义变量不需要加引号 print(name) print(age) name2="w ...

  7. Intellij IDEA生成foreach或者loop 快捷键

    iter Iterate (for each..in) itin Iterate (for..in) itli Iterate over a List itar Iterate elements of ...

  8. SimpleDateFormat的安全问题解决方法

    问题: SimpleDateFormat 是线程不安全的类,一般不要定义为static变量,如果定义为static,必须加锁,或者使用DateUtils工具类. 而且SimpleDateFormat ...

  9. 【转】CEF3加载网页---多字节字符集和UNICODE字符集

    static char* MBSCToCEF(const char* mbcsStr) { wchar_t* wideStr; char* utf8Str; int charLen; charLen ...

  10. MySQL:安装mysqld系统及基础应用

    MySQL篇 第一章.安装mysqld系统及基础应用 一.安装 注意:mysql的标点符号只能是英文的标点符号. 1.设置配置文件. 文件格式:文本格式 文件位置:Mysql的主目录下 文件名称:my ...