首页 > 其他分享 >BZOJ 2427: [HAOI2010]软件安装 树形背包

BZOJ 2427: [HAOI2010]软件安装 树形背包

时间:2023-07-07 13:35:46浏览次数:48  
标签:... ch 2427 依赖 HAOI2010 软件 include 安装 BZOJ



2427: [HAOI2010]软件安装


Time Limit: 10 Sec  Memory Limit: 128 MB

Submit: 1275  Solved: 492

[Submit][Status][Discuss]

Description


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

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

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


Input


第1行:N, M  (0<=N<=100, 0<=M<=500)
      第2行:W1, W2, ... Wi, ..., Wn (0<=Wi<=M )
      第3行:V1, V2, ..., Vi, ..., Vn  (0<=Vi<=1000 )
      第4行:D1, D2, ..., Di, ..., Dn (0<=Di<=N, Di≠i )


Output


一个整数,代表最大价值。


Sample Input


3 10
5 5 6
2 3 4
0 1 1


Sample Output


5




首先说明 这个题有坑点 没有说是一棵树 得缩点 有可能是森林

昨天。。谁讲的来着。。。

反正学了树形背包 会了O(n*m*m)做法O(n*m)有待后续研究

缩点后增加根向所有无入度的点连边,树形背包 AC


#include<cmath>
#include<ctime>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<complex>
#include<iostream>
#include<algorithm>
#include<iomanip>
#include<vector>
#include<string>
#include<queue>
#include<map>
#include<set>
using namespace std;
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch<='9'&&ch>='0'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
	return x*f;
}
const int N=110;const int M=550;
const int inf=0X7f7f7f7f;
int n,m,val[N],weight[N],dp[N][M],sccw[N],sccval[N];
int dfn[N],low[N],s[N],belong[N],size[N],top,cnt,scc;
int edcnt,head[N],last[N],ecnt,root[N];
bool indegree[N];
bool ins[N],vis[N];
struct EDGE{int to,nt;}ed[N<<2],e[N<<2];
inline void added(int u,int v){ed[++edcnt]=(EDGE){v,head[u]};head[u]=edcnt;}
inline void add(int u,int v){e[++ecnt]=(EDGE){v,last[u]};last[u]=ecnt;}
void tarjan(int u)
{
	dfn[u]=low[u]=++cnt;ins[u]=1;s[++top]=u;
	for(int i=head[u];i;i=ed[i].nt)
	{
		if(!dfn[ed[i].to])
		{tarjan(ed[i].to);low[u]=min(low[u],low[ed[i].to]);}
		else if(ins[ed[i].to]&&dfn[ed[i].to]<low[u])low[u]=dfn[ed[i].to];
	}
	if(dfn[u]==low[u])
	{
		scc++;int temp=0;
		do
		{
			temp=s[top--];ins[temp]=0;
			belong[temp]=scc;size[scc]++;
			sccw[scc]+=weight[temp];sccval[scc]+=val[temp];
		}
		while(temp!=u);
	}
}
void dfs(int u)
{
	for(int i=1;i<sccw[u];i++)dp[u][i]=0;
	for(int i=sccw[u];i<=m;i++)dp[u][i]=sccval[u];
	for(int i=last[u];i;i=e[i].nt)
	{
		if(vis[e[i].to])continue;vis[e[i].to]=1;
		dfs(e[i].to);
		for(int j=m;j>=sccw[u];j--)
		for(int k=1;k<=j-sccw[u];k++)
		dp[u][j]=max(dp[u][j],dp[e[i].to][k]+dp[u][j-k]);
	}
}
int main()
{
	n=read();m=read();int u;
	for(int i=1;i<=n;i++)weight[i]=read();
	for(int i=1;i<=n;i++)val[i]=read();
	for(int i=1;i<=n;i++){u=read();if(u)added(u,i);}
	for(int i=1;i<=n;i++){if(!dfn[i])tarjan(i);}
	for(int i=1;i<=n;i++)
	{
		for(int j=head[i];j;j=ed[j].nt)
		{
			if(belong[i]!=belong[ed[j].to])
			{add(belong[i],belong[ed[j].to]);indegree[belong[ed[j].to]]=1;}
		}
	}
	for(int i=1;i<=scc;i++)if(!indegree[i])root[++root[0]]=i;
	for(int j=1;j<=root[0];j++)add(scc+1,root[j]);
	dfs(scc+1);
	printf("%d\n",dp[scc+1][m]);
	return 0;	
}
/*
3 10
5 5 6
2 3 4
0 1 1 

5
*/




标签:...,ch,2427,依赖,HAOI2010,软件,include,安装,BZOJ
From: https://blog.51cto.com/u_16181403/6652001

相关文章

  • BZOJ 1042:[HAOI2008]硬币购物 容斥原理 背包dp
    1042:[HAOI2008]硬币购物TimeLimit: 10Sec  MemoryLimit: 162MBSubmit: 2505  Solved: 1505[Submit][Status][Discuss]Description硬币购物一共有4种硬币。面值分别为c1,c2,c3,c4。某人去商店买东西,去了tot次。每次带di枚ci硬币,买si的价值的东西。请问每次......
  • BZOJ 2243: [SDOI2011]染色 树链剖分+线段树
    2243:[SDOI2011]染色TimeLimit: 20Sec  MemoryLimit: 512MBSubmit: 7623  Solved: 2855[Submit][Status][Discuss]Description给定一棵有n个节点的无根树和m个操作,操作有2类:1、将节点a到节点b路径上所有点都染成颜色c;2、询问节点a到节点b路径上的颜色段数量(连续......
  • BZOJ 1725: [Usaco2006 Nov]Corn Fields牧场的安排 状压dp
    1725:[Usaco2006Nov]CornFields牧场的安排TimeLimit: 5Sec  MemoryLimit: 64MBSubmit: 698  Solved: 489[Submit][Status][Discuss]DescriptionFarmerJohn新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M<=12;1<=N<=12),每一格都是一块正方形的土地。FJ......
  • BZOJ 1915: [Usaco2010 Open]奶牛的跳格子游戏 单调队列优化dp
    1915:[Usaco2010Open]奶牛的跳格子游戏TimeLimit: 4Sec  MemoryLimit: 64MBSubmit: 281  Solved: 110[Submit][Status][Discuss]Description奶牛们正在回味童年,玩一个类似跳格子的游戏,在这个游戏里,奶牛们在草地上画了一行N个格子,(3<=N<=250,000),编号为1..N......
  • BZOJ 1877: [SDOI2009]晨跑 费用流拆点
    1877:[SDOI2009]晨跑TimeLimit: 4Sec  MemoryLimit: 64MBSubmit: 2271  Solved: 1215[Submit][Status][Discuss]DescriptionElaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑、仰卧起坐等等,不过到目前为止,他坚持下来的只有晨跑。现在给出一张......
  • BZOJ 2929: [Poi1999]洞穴攀行 最大流
    2929:[Poi1999]洞穴攀行TimeLimit: 1Sec  MemoryLimit: 128MBSubmit: 388  Solved: 215[Submit][Status][Discuss]Description洞穴学者在ByteMountain的GrateCave里组织了一次训练。训练中,每一位洞穴学者要从最高的一个室到达最底下的一个室。他们只能向下走......
  • BZOJ 1927: [Sdoi2010]星际竞速 费用流
    1927:[Sdoi2010]星际竞速TimeLimit: 20Sec  MemoryLimit: 259MBSubmit: 2344  Solved: 1442[Submit][Status][Discuss]Description10年一度的银河系赛车大赛又要开始了。作为全银河最盛大的活动之一,夺得这个项目的冠军无疑是很多人的梦想,来自杰森座α星的悠......
  • BZOJ 1497: [NOI2006]最大获利 最大权闭合子图
    1497:[NOI2006]最大获利TimeLimit: 5Sec  MemoryLimit: 64MBSubmit: 5196  Solved: 2530[Submit][Status][Discuss]Description新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战。THU集团旗下的CS&T通讯公司在新一代通讯技术血战的前夜,需要做......
  • BZOJ 1022: [SHOI2008]小约翰的游戏John SG函数 Anti−SG
    1022:[SHOI2008]小约翰的游戏JohnTimeLimit: 1Sec  MemoryLimit: 162MBSubmit: 2667  Solved: 1701[Submit][Status][Discuss]Description小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有n堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一......
  • BZOJ 3996: [TJOI2015]线性代数 最大权闭合子图 最小割
    3996:[TJOI2015]线性代数TimeLimit: 10Sec  MemoryLimit: 128MBSubmit: 1499  Solved: 885[Submit][Status][Discuss]Description给出一个N*N的矩阵B和一......