分析:

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

有环就搞掉就就可以了...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. HTML meta 标签总结

    本文转载自:http://www.cnblogs.com/lovesong/p/5745893.html meta标签作用 META标签是HTML标记HEAD区的一个关键标签,提供文档字符集.使用语言 ...

  2. OSGI企业应用开发(二)Eclipse中搭建Felix运行环境

    上篇文章介绍了什么是OSGI以及使用OSGI构建应用的优点,接着介绍了两款常用的OSGI实现,分别为Apache Felix和Equinox,接下来开始介绍如何在Eclipse中使用Apache Fe ...

  3. <Android 基础(三十一)> ObjectAnimator

    简介 ObjectAnimator,是ValueAnimator的子类,支持利用目标视图的属性来实现动画效果.构造ObjectAnimator的时候,将会提取对应的参数来定义动画对象和对象属性.合适的 ...

  4. python 日志打印之logging使用介绍

    python 日志打印之logging使用介绍 by:授客QQ:1033553122 测试环境: Python版本:Python 2.7   简单的将日志打印到屏幕 import logging lo ...

  5. React Native 如何做轮播图 react-native-swiper

    //:仿饿了么github:https://github.com/stoneWeb/elm-react-native 欢迎各位同学加入: React-Native群:397885169 大前端群:54 ...

  6. Problem2-Project Euler

    Even Fibonacci numbers   Each new term in the Fibonacci sequence is generated by adding the previous ...

  7. 前端开发使用Photoshop切图详细步骤

    切图的主要目的是从设计师提供的psd中获取网页制作所要的资源 一.界面设置 1. 新建文件,调整界面大小,背景设置为透明 2. 自动选择,把组切换为图层 3. 添加窗口内容,一共四项:图层.历史纪录. ...

  8. Oracle EBS INV 更新状态

    使用API改变现有物料状态,改成如下:On-Hand, Subinventory, Locator, Lot & Serial.参数使用如下:H, O, S, Z, L.对应如下: 'H' - ...

  9. c#中的数据类型简介(委托)

    什么是委托? 委托是一种类型,它封装了一类方法,这些方法具有相同的方法签名(signature)和返回类型.定义听起来有点拗口,首先可以确定委托是一种数据类型,那么什么是方法签名,其实就是指方法的输入 ...

  10. SQL Server登录方式

    SQL Server登录服务器有两种验证方式,一种是windows身份验证,也就是本机验证,另一种就是SQL Server验证,就是使用账号密码的方式验证. 在使用windows身份验证登录时,直接就 ...