bzoj 2427[HAOI2010] 软件安装

/*强连通分量缩点,完全背包就够了*/
/*受hzwer大神的启发*/
#include
#include
#include
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]=0;j--)
		 for(int k=0;k<=j;++k)
		  if(f[x][j]=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]);
}

你可能感兴趣的:(bzoj 2427[HAOI2010] 软件安装)