bzoj 2427[HAOI2010] 软件安装
2015-10-08 18:54
316 查看
/*强连通分量缩点,完全背包就够了*/ /*受hzwer大神的启发*/ #include<iostream> #include<cstdio> #include<cstdlib> using namespace std; int dfn[205],low[205],head[205],tail[205],w[205],v[205],d[205],weight[205],value[205],belong[205],stack[205]; int f[205][600]; int n,m,times,top,tar_num,tot,ans; bool vis[205],in[205]; struct dd{ int begin,end,next; }jie[6000]; struct df{ int begin,end,next; }st[6000]; void add(int x,int y){ jie[++tot].begin=x; jie[tot].end=y; jie[tot].next=head[x]; head[x]=tot; } void add2(int x,int y){ in[y]=1; st[++ans].begin=x; st[ans].end=y; st[ans].next=tail[x]; tail[x]=ans; } void tar(int x){ times++; dfn[x]=low[x]=times; vis[x]=1; stack[++top]=x; for(int i=head[x];i;i=jie[i].next){ int sto=jie[i].end; if(!dfn[sto]){ tar(sto); if(low[sto]<low[x]) low[x]=low[sto]; } else if(vis[sto]) if(dfn[sto]<low[x]) low[x]=dfn[sto]; } if(dfn[x]==low[x]){ ++tar_num; int yu; do{ yu=stack[top--]; belong[yu]=tar_num; weight[tar_num]+=w[yu]; value[tar_num]+=v[yu]; vis[yu]=0; }while(x!=yu); } } void getans(int x){ for(int i=tail[x];i;i=st[i].next){ int yu=st[i].end; getans(yu); for(int j=m-weight[x];j>=0;j--) for(int k=0;k<=j;++k) if(f[x][j]<f[x][k]+f[yu][j-k]) f[x][j]=f[x][k]+f[yu][j-k]; } for(int i=m;i>=0;--i) if(i>=weight[x]) f[x][i]=f[x][i-weight[x]]+value[x]; else f[x][i]=0; } void rebuild(){ for(int i=1;i<=tot;++i) if(belong[jie[i].begin]!=belong[jie[i].end]) add2(belong[jie[i].end],belong[jie[i].begin]); for(int i=1;i<=tar_num;++i) if(!in[i]) add2(tar_num+1,i); getans(tar_num+1); } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;++i) scanf("%d",&w[i]); for(int i=1;i<=n;++i) scanf("%d",&v[i]); for(int i=1;i<=n;++i) scanf("%d",&d[i]); for(int i=1;i<=n;++i){ if(!d[i]) continue; else add(i,d[i]); } for(int i=1;i<=n;++i) if(!dfn[i]) tar(i); rebuild(); printf("%d",f[tar_num+1][m]); }
相关文章推荐
- superoj912 resistance
- 完成与执行任务
- 283.Move Zeroes
- Android基础入门教程——2.4.14 ViewPager的简单使用
- 100.Same Tree
- iOS NSString 字符串处理:截取字符串、匹配字符串、分隔字符串、拼接字符串、替换字符串
- [转][译][Android基础]Android Fragment之间的通信
- 判断获取json数据中key是否为空
- nagios4.1.1 服务端及监控端部署(二)之pnp4nagios 配置出图
- sh: 0: getcwd() failed: No such file or directory解决
- android 6.0不再提供org.apache.http.*
- 237.Delete Node in a Linked List
- php CI框架入门
- opencv-2.4.11在vs2010中的安装
- POJ 1159 Palindrome (LCS)
- Idea 编译报错 javacTask: 源发行版 1.6 需要目标发行版 1.6
- 104.Maximum Depth of Binary Tree
- 智能车学习(一)—— 硬件准备
- POJ 1986(LCA and RMQ)
- AndroidManifest.xml