HAOI2010软件安装
首先tarjan缩点应该能看出来,然后我用topsort跑了个DAG上的一维dp,结果WA的很惨。
其实用DAG应该也能做,但是DAG强调整体顺序,而对一些局部问题,例如两个儿子怎么分配,是否给当前节点分配,那就太粗略化了,导致错误。
正确的姿势是把所有没有入度的点接到虚根上,因为tarjan缩完很可能是个森林,剩下的就是跑树形依赖的背包了。
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#include<set>
#include<map>
using namespace std;
struct EDGE{
int ed,nex;
}edge[],edgec[];int num,numc,first[],firstc[];
int read(){
int sum=,f=;char x=getchar();
while(x<''||x>''){
if(x=='-') f=-;
x=getchar();
}while(x>=''&&x<=''){
sum=sum*+x-'';
x=getchar();
}return sum*f;
}
int n,m,w[],v[],dp[][];
int dfn[],low[],ord;
int stack[],top,ans,root;
int sccnum,bl[];
vector<int>scc[];
int wc[],vc[],du[];
bool ins[];
void add(int st,int ed){
edge[++num].ed=ed;
edge[num].nex=first[st];
first[st]=num;
}
void addc(int st,int ed){
edgec[++numc].ed=ed;
edgec[numc].nex=firstc[st];
firstc[st]=numc;
}
void tarjan(int x){
dfn[x]=low[x]=++ord;
stack[++top]=x;ins[x]=;
for(int i=first[x];i;i=edge[i].nex){
int y=edge[i].ed;
if(!dfn[y]){
tarjan(y);
low[x]=min(low[x],low[y]);
}else if(ins[y])
low[x]=min(low[x],dfn[y]);
}if(low[x]==dfn[x]){
sccnum++;int p;
do{
p=stack[top--];ins[p]=;
bl[p]=sccnum;scc[sccnum].push_back(p);
}while(x!=p);
}
} void dfs(int x){
//cout<<"fa="<<x<<endl;
/* for(int i=firstc[x];i;i=edgec[i].nex){
int y=edgec[i].ed;
cout<<y<<" ";
}*/
for(int i=firstc[x];i;i=edgec[i].nex){
int y=edgec[i].ed;
dfs(y);
for(int j=m-wc[x];j>=;j--)
for(int k=;k<=j;k++)
dp[x][j]=max(dp[x][j],dp[x][k]+dp[y][j-k]);
}
for(int i=m;i>=wc[x];i--) dp[x][i]=dp[x][i-wc[x]]+vc[x];
for(int i=;i<wc[x];i++) dp[x][i]=;
}
int main(){
/*freopen("9.in","r",stdin);
freopen("9.out","w",stdout);*/
/* memset(dp,0xcf,sizeof(dp));
dp[0]=0;*/
n=read();m=read();
for(int i=;i<=n;i++) w[i]=read();
for(int i=;i<=n;i++) v[i]=read();
for(int i=,D;i<=n;i++){
D=read();
if(!D) continue;
add(D,i);
}
for(int i=;i<=n;i++)
if(!dfn[i]) tarjan(i);
for(int i=;i<=sccnum;i++)
for(int j=;j<scc[i].size();j++)
wc[i]+=w[scc[i][j]],vc[i]+=v[scc[i][j]];
for(int i=;i<=n;i++){
for(int j=first[i];j;j=edge[j].nex){
int y=edge[j].ed;
if(bl[i]==bl[y]) continue;
addc(bl[i],bl[y]);
// cout<<"St="<<bl[i]<<" Ed="<<bl[y]<<endl;
du[bl[y]]++;
}
}
root=sccnum+;
for(int i=;i<=sccnum;i++)
if(!du[i]) addc(root,i);
/* for(int i=1;i<=numc;i++)
cout<<edgec[i].ed<<" "<<edgec[i].nex<<endl;*/
/* for(int i=1;i<=sccnum;i++){
for(int j=0;j<scc[i].size();j++)
cout<<scc[i][j]<<" ";
cout<<endl;
}
for(int i=1;i<=sccnum;i++)
cout<<wc[i]<<" "<<vc[i]<<endl;*/
/* for(int i=1;i<=n;i++)
cout<<bl[i]<<" ";cout<<endl;
for(int i=1;i<=sccnum;i++)
cout<<wc[i]<<" "<<vc[i]<<endl;
for(int i=1;i<=numc;i++)
cout<<edgec[i].st<<" "<<edgec[i].ed<<endl;*/
dfs(root);
/* for(int i=0;i<=m;i++)
cout<<dp[root][i]<<" ";cout<<endl;*/
printf("%d",dp[root][m]);cout<<endl;
return ;
}
HAOI2010软件安装的更多相关文章
- BZOJ_2427_[HAOI2010]软件安装_tarjan+树形DP
BZOJ_2427_[HAOI2010]软件安装_tarjan+树形DP 题意: 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁 ...
- 【BZOJ2427】[HAOI2010]软件安装(动态规划,Tarjan)
[BZOJ2427][HAOI2010]软件安装(动态规划,Tarjan) 题面 BZOJ 洛谷 题解 看到这类题目就应该要意识到依赖关系显然是可以成环的. 注意到这样一个性质,依赖关系最多只有一个, ...
- 洛谷 P2515 [HAOI2010]软件安装 解题报告
P2515 [HAOI2010]软件安装 题目描述 现在我们的手头有\(N\)个软件,对于一个软件\(i\),它要占用\(W_i\)的磁盘空间,它的价值为\(V_i\).我们希望从中选择一些软件安装到 ...
- [BZOJ2427][HAOI2010]软件安装(Tarjan+DP)
2427: [HAOI2010]软件安装 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1987 Solved: 791[Submit][Statu ...
- bzoj 2427 [HAOI2010]软件安装 Tarjan缩点+树形dp
[HAOI2010]软件安装 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2029 Solved: 811[Submit][Status][Dis ...
- Tarjan+树形DP【洛谷P2515】[HAOI2010]软件安装
[洛谷P2515][HAOI2010]软件安装 题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得 ...
- 【BZOJ2427】[HAOI2010]软件安装 Tarjan+树形背包
[BZOJ2427][HAOI2010]软件安装 Description 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为 ...
- bzoj2427:[HAOI2010]软件安装(Tarjan+tree_dp)
2427: [HAOI2010]软件安装 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1053 Solved: 424[Submit][Statu ...
- HAOI2010软件安装(树形背包)
HAOI2010软件安装(树形背包) 题意 有n个物品,每个物品最多会依赖一个物品,但一个物品可以依赖于一个不独立(依赖于其它物品)的物品,且可能有多个物品依赖一个物品,并且依赖关系可能形成一个环.现 ...
- [HAOI2010]软件安装(Tarjan,树形dp)
[HAOI2010]软件安装 题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可 ...
随机推荐
- Eclipse错误提示: Symbol 'xxxx' could not be resolved
在eclipse中安装maven(网上资源):https://zhinan.sogou.com/guide/detail/?id=1610049267 项目名 右键->configure-> ...
- 打包JavaFX11桌面应用程序
打包JavaFX11桌面应用程序 这是JavaFX系列的第二弹,第一弹在这里 在第一弹中,我们使用的是OpenJDK8,但是OpenJDK8和Oracle Java JDK不一样,它没有内置JavaF ...
- 【ExtJs】ext前台中的日期控件传输时间到后台的转换保存过程
//前台日期选择框 {fieldLabel:, padding: ',afterLabelTextTpl: required,allowBlank: false,format: 'Y-m-d H:i: ...
- Java高并发程序设计学习笔记(六):JDK并发包(线程池的基本使用、ForkJoin)
转自:https://blog.csdn.net/dataiyangu/article/details/86573222 1. 线程池的基本使用1.1. 为什么需要线程池1.2. JDK为我们提供了哪 ...
- python图像处理
Python常用处理图像的库是PIL,另外还有opencv.Matplotlib.NumPy.SciPy.skimage 详情请参考:https://www.cnblogs.com/qiaozhoul ...
- Vi 入门简易教程
首先,请注意,以下所讲的,全部是键盘在英文输入模式下.如果键盘是在中文输 入模式,全部的指令不正确. vi 有两种模式: Command Mode(指令模式) and Insert Mode(我姑且称 ...
- LNMP安装与配置之MySQL
MySQL 是最流行的关系型数据库管理系统之一,今天的安装是在CentOS7环境下进行安装,安装的版本是MySQL5.7,有需要别的版本可点击 官网. 一.安装 1.配置YUM源 # 下载mysql ...
- 6.MNIST数据集分类简单版本
import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data # 载入数据集 mnist = i ...
- 给零基础的小白从0到1的react-naitve电商app——简单易学!
先上链接https://github.com/duf1991/DY...我的第一个react-native学习成果,欢迎各位大佬star和issue!
- .Net界面开发神器—DevExpress官方汉化包免费下载!还在等什么?
点击获取DevExpress v19.1.7新版试用下载 DevExpress Localization Service允许您创建一组自定义的附属程序集,要将语言包添加到程序集中,请查看本文中为大家列 ...