luogu P2515 [HAOI2010]软件安装
看到唯一的依赖关系,容易想到树型dp,即\(f_{i,j}\)表示选点\(i\)及子树内连通的点,代价为\(j\)的最大价值,然后就是选课那道题
但是要注意
1.题目中的依赖关系不一定是树,可能会有环,我们可以发现环里面的点要么全选要么全不选,要用tarjan把环缩为一个点,同时把代价和价值加到缩后的点上
2.记得把缩完点后所有没有依赖关系的点连到超级点(0点上)
3.树型dp别写错了,注意边界
强行连踩三雷qwq
// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define LL long long
#define il inline
#define re register
#define inf 2099999999
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define S(a) (1<<(a-1))
using namespace std;
const int N=100+10,M=500+10;
il LL rd()
{
    re LL x=0,w=1;re char ch=0;
    while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
    return x*w;
}
int to[N<<1],nt[N<<1],hd[N],tot=1;
il void add(int x,int y)
{
  ++tot,to[tot]=y,nt[tot]=hd[x],hd[x]=tot;
}
int n,m,a[N][2],d[N],f[N][M];
int dfn[N],low[N],po[N],st[N],tt,ti;
char ista[N],cq[N];
il void tj(int x)
{
  dfn[x]=low[x]=++ti,st[++tt]=x,ista[x]=1;
  for(int i=hd[x];i;i=nt[i])
    {
      int y=to[i];
      if(!dfn[y]) tj(y),low[x]=min(low[x],low[y]);
      else if(ista[y]) low[x]=min(low[x],low[y]);
    }
  if(low[x]==dfn[x])
    {
      while(tt)
        {
          int y=st[tt--];
          ista[y]=0,po[y]=x;
          if(x==y) break;
          a[x][0]+=a[y][0],a[x][1]+=a[y][1],cq[x]=1;
        }
    }
}
il void dp(int x)
{
  //if(a[x][0]>m) return;
  f[x][a[x][0]]=a[x][1];
  for(int j=0;j<a[x][0];j++) f[x][j]=0;
  for(int i=hd[x];i;i=nt[i])
    {
      int y=to[i];
      dp(y);
      for(int k=m;k>=a[x][0];k--)
      for(int j=a[y][0];k-j>=a[x][0];j++)
        f[x][k]=max(f[x][k],f[x][k-j]+f[y][j]);
    }
}
int main()
{
  n=rd(),m=rd();
  for(int i=1;i<=n;i++) a[i][0]=rd();
  for(int i=1;i<=n;i++) a[i][1]=rd();
  for(int i=1;i<=n;i++) d[i]=rd(),add(d[i],i),po[i]=i;
  for(int i=0;i<=n;i++)
    if(!dfn[i]) tj(i);
  memset(hd,0,sizeof(hd)),tot=1;
  for(int i=1;i<=n;i++)
    if(po[i]!=po[d[i]]) add(po[d[i]],po[i]);
  for(int i=1;i<=n;i++)
    if(cq[i]&&po[i]==i) add(0,i);
  memset(f,-0x3f3f3f,sizeof(f));
  dp(0);
  int ans=0;
  for(int i=0;i<=m;i++) ans=max(ans,f[0][i]);
  printf("%d\n",ans);
  return 0;
}
luogu P2515 [HAOI2010]软件安装的更多相关文章
- luogu P2515 [HAOI2010]软件安装 |Tarjan+树上背包
		题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为MM计算机上,使得这些软件的价值尽可能大(即Vi的和最大). 但 ... 
- 洛谷 P2515 [HAOI2010]软件安装 解题报告
		P2515 [HAOI2010]软件安装 题目描述 现在我们的手头有\(N\)个软件,对于一个软件\(i\),它要占用\(W_i\)的磁盘空间,它的价值为\(V_i\).我们希望从中选择一些软件安装到 ... 
- 洛谷——P2515 [HAOI2010]软件安装
		https://www.luogu.org/problem/show?pid=2515#sub 题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中 ... 
- 【Luogu P2515】软件安装
		Luogu P2515 这道题的题面与P2146有点像.一些不同地方就是P2146是无环的,这题是有环的. 很显然,如果有几个软件的依赖关系形成环,那么这几个软件就可以被看成是一个大软件,其价值和空间 ... 
- 洛谷—— P2515 [HAOI2010]软件安装
		题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大). 但是 ... 
- 洛谷 P2515 [HAOI2010]软件安装
		题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大). 但是 ... 
- [bzoj2427]P2515 [HAOI2010]软件安装(树上背包)
		tarjan+树上背包 题目描述 现在我们的手头有 \(N\) 个软件,对于一个软件 \(i\),它要占用 \(W_i\) 的磁盘空间,它的价值为 \(V_i\).我们希望从中选择一些软件安装到一台磁 ... 
- 洛谷 P2515 [HAOI2010]软件安装(缩点+树形dp)
		题面 luogu 题解 缩点+树形dp 依赖关系可以看作有向边 因为有环,先缩点 缩点后,有可能图不联通. 我们可以新建一个结点连接每个联通块. 然后就是树形dp了 Code #include< ... 
- P2515 [HAOI2010]软件安装
		树形背包 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> ... 
随机推荐
- 【Linux】工作管理
			在进行工作管理的行为中,其实每个工作都是目前bash的子进程,即彼此间是有相关性的.我们无法以job control的方式由tty1的环境去管理tty2的bash 当只有一个终端时,可以出现提示符让你 ... 
- AISing Programming Contest 2019 翻车记
			A:签到. #include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> ... 
- wamp下php报错session_start(): open(d:/wamp/tmp\sess_ku776hvb06ko4lv9d11e7mnfj1, O_RDWR) failed: No such file or directory
			报错提示 session_start(): open(d:/wamp/tmp\sess_ku776hvb06ko4lv9d11e7mnfj1, O_RDWR) failed: No such file ... 
- C# 后台访问webapi
			具体在哪看见的忘记了. 异步: public static class CallWebAPI { public static async Task<string> APIPost(stri ... 
- 洛谷P2516 [HAOI2010]最长公共子序列(LCS,最短路)
			洛谷题目传送门 一进来就看到一个多月前秒了此题的ysn和YCB%%% 最长公共子序列的\(O(n^2)\)的求解,Dalao们想必都很熟悉了吧!不过蒟蒻突然发现,用网格图貌似可以很轻松地理解这个东东? ... 
- 架构师成长之路2.3-PXE+Kickstart无人值守大量部署Linux
			点击返回架构师成长之路 架构师成长之路2.3-PXE+Kickstart无人值守大量部署Linux 所谓的无人值守,就是自动应答,当安装过程中需要人机交互提供某些选项的答案时(如如何分区),自动应答文 ... 
- Java创建文件
			public class FileTest { public static void main(String[] args) throws IOException { File file = new ... 
- Spring  MVC 起步
			跟踪Spring MVC的请求 在请求离开浏览器时①,会带有用户所请求内容的信息,至少会包含请求的URL. 请求旅程的第一站是Spring的DispatcherServlet.与大多数基于Java的W ... 
- 【bzoj2007】 Noi2010—海拔
			http://www.lydsy.com/JudgeOnline/problem.php?id=2007 (题目链接) 题意 $(n+1)*(n+1)$的网格图上,相邻两点间有一些人流.左上角点的海拔 ... 
- 洛谷P2668 斗地主
			好,终于搞完了这一道毒瘤题...... 先想到搜索,然后想到状压,发现数据组数很多,又是随机,还是决定用搜索. 先搜出的多的,于是顺序是三个顺子,然后按照多到少搜带牌,最后是不带牌. 大体思路很简单, ... 
