分析:

一开始我以为是裸的树形背包...之后被告知这东西...可能有环...什么!有环!

有环就搞掉就就可以了...tarjan缩点...建图记得建立从i到d[i]之后跑tarjan,因为这样才能判断出环的情况...

缩点之后重新建图就需要见d[i]到i了...

附上代码:

#include <cstdio>
#include <cmath>
#include <iostream>
#include <queue>
#include <algorithm>
#include <cstring>
#include <cstdlib>
using namespace std;
#define N 205
struct node
{
int to,next;
}e[N];
int f[N][505],head[N],cnt,dfn[N],low[N],vis[N],sta[N],top,tims,fa[N],n,m,a[N],b[N],in1[N];
void add(int x,int y){if(!y)return;e[cnt]=(node){y,head[x]};head[x]=cnt++;}
void tarjan(int x)
{
dfn[x]=low[x]=++tims;sta[++top]=x;vis[x]=1;
for(int i=head[x];i!=-1;i=e[i].next)
{
int to1=e[i].to;
if(vis[to1])low[x]=min(dfn[to1],low[x]);
else if(!dfn[to1])tarjan(to1),low[x]=min(low[x],low[to1]);
}
if(dfn[x]==low[x])
{
while(sta[top]!=x)
{
fa[sta[top]]=x;
vis[sta[top]]=0;
top--;
}
fa[x]=x;vis[x]=0;top--;
}
}
vector <int>v[N];
void dfs(int x)
{
for(int i=0;i<v[x].size();i++)
{
int to1=v[x][i];
dfs(to1);
for(int j=m;j;j--)
{
for(int k=j;~k;k--)
{
f[x][j]=max(f[to1][k]+f[x][j-k],f[x][j]);
}
}
}
for(int i=m;i>=b[x];i--)f[x][i]=f[x][i-b[x]]+a[x];
for(int i=0;i<b[x];i++)f[x][i]=0;
}
int main()
{
scanf("%d%d",&n,&m);memset(head,-1,sizeof(head));
for(int i=1;i<=n;i++)scanf("%d",&b[i]);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1,x;i<=n;i++)scanf("%d",&x),add(i,x);
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!=-1;j=e[j].next)
{
int to1=e[j].to;
if(fa[to1]!=fa[i])v[fa[to1]].push_back(fa[i]),in1[fa[i]]++;
}
}
for(int i=1;i<=n;i++)if(fa[i]==i&&(!in1[i]))v[0].push_back(i);
for(int i=1;i<=n;i++)if(fa[i]!=i)a[fa[i]]+=a[i];
for(int i=1;i<=n;i++)if(fa[i]!=i)b[fa[i]]+=b[i];
dfs(0);printf("%d\n",f[0][m]);return 0;
}

  

BZOJ2427: [HAOI2010]软件安装 tarjan+树形背包的更多相关文章

  1. 【BZOJ2427】[HAOI2010]软件安装 Tarjan+树形背包

    [BZOJ2427][HAOI2010]软件安装 Description 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为 ...

  2. 【bzoj2427】[HAOI2010]软件安装 Tarjan+树形背包dp

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

  3. BZOJ 2427: [HAOI2010]软件安装 tarjan + 树形背包

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

  4. [BZOJ2427][HAOI2010]软件安装(tarjan+树形DP)

    如果依赖关系出现环,那么对于一个环里的点,要么都选要么都不选, 所以每个环可以当成一个点,也就是强连通分量 然后就可以构造出一颗树,然后树形背包瞎搞一下就行了 注意要搞一个虚拟节点当根节点 Code ...

  5. 【BZOJ-2427】软件安装 Tarjan + 树形01背包

    2427: [HAOI2010]软件安装 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 960  Solved: 380[Submit][Status ...

  6. [BZOJ2427][HAOI2010]软件安装(Tarjan+DP)

    2427: [HAOI2010]软件安装 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1987  Solved: 791[Submit][Statu ...

  7. bzoj2427:[HAOI2010]软件安装(Tarjan+tree_dp)

    2427: [HAOI2010]软件安装 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1053  Solved: 424[Submit][Statu ...

  8. HAOI2010软件安装(树形背包)

    HAOI2010软件安装(树形背包) 题意 有n个物品,每个物品最多会依赖一个物品,但一个物品可以依赖于一个不独立(依赖于其它物品)的物品,且可能有多个物品依赖一个物品,并且依赖关系可能形成一个环.现 ...

  9. [HAOI2010]软件安装(树形背包,tarjan缩点)

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

随机推荐

  1. nodejs设置NODE_ENV环境变量(1)

    看下app.js文件中的一部分代码,如下: //开发环境错误处理 // will print stacktrace if (app.get('env') === 'development') { ap ...

  2. DevOps之技能面

    <教学手册(Teaching Manual)> 教学:人类培养态度.传授知识.训练技能的活动.教学目的:知识与技能的层次:(了解.理解.熟悉.掌握.精通).教学手段:理论与实践的方面:(科 ...

  3. python的类基础

    python类的基础: 1,面向对象的基本概念 类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 类变量:类变量在整个实例化的 ...

  4. python函数-匿名函数

    1,匿名函数,故名思意,就是没有名字的函数. def fun(x): return x+x 上述代码的作用就是求x+x的和的函数.如果调用该函数的话,可以使用fun(1)即可.那么lambda函数和上 ...

  5. Android Studio之could not reserve enough space for object heap报错

    在用AndroidStudio时出现这样的错误:  搞了半天终于找到了解决办法,但是很麻烦.就是每次创建工程后,在gradle.properties文件中加入如下代码: org.gradle.jvma ...

  6. 搞定pycharm专业版的安装

    学习python也有一段时间了,装了python2,也装了python3.对于IDE当然首选了人人拍掌叫好的pycharm.其实作为小白,一开始的时候并不知道什么是IDE,什么是pychram,以为装 ...

  7. nc 命令使用详解

    nc 命令介绍: Ncat is a feature-packed networking utility which reads and writes data across networks fro ...

  8. 通过yum源在centOS7安装mysql8

    1.去官网下载rpm文件,该文件专门用于yum安装方式: 到官网https://www.mysql.com/downloads/下载社区版Community(针对个人),如下图: 然后拉到最下面,我下 ...

  9. 了解注解及java提供的几个基本注解

    先通过@SuppreessWarnings的应用让大家直观地了解注解: 通过System.runFinalizersOnExit(true);的编译器警告引出           @SuppressW ...

  10. AWS服务学习

    什么是云计算? 云计算是用户通过Internet云服务平台按需提供计算能力.数据库存储.应用程序和其他IT资源,采用按需支付定价模式 无论您是在运行拥有数百万移动用户的照片共享应用程序,还是要为您的业 ...