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

2427: [HAOI2010]软件安装

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 960  Solved: 380
[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

HINT

Source

Day2

Solution

把环缩成一个点...

建立超级根0....

然后树形01背包

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
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>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}return x*f;
}
#define MAXN 110
#define MAXM 510
struct EdgeNode{int next,to;}edge[MAXN<<1],road[MAXN<<1];
int head[MAXN],cnt=1,first[MAXN],tot=1;
inline void AddEdge(int u,int v) {cnt++; edge[cnt].next=head[u]; head[u]=cnt; edge[cnt].to=v;}
inline void InsertEdge(int u,int v) {if (!u) return; AddEdge(u,v);}
int w[MAXN],v[MAXN],V[MAXN],W[MAXN],N,M;
int dfn[MAXN],low[MAXN],st[MAXN],top,visit[MAXN],belong[MAXN],size[MAXN],dfsn,scc;
inline void Tarjan(int x)
{dfn[x]=low[x]=++dfsn; visit[x]=1; st[++top]=x;for (int i=head[x]; i; i=edge[i].next)if (!dfn[edge[i].to]) Tarjan(edge[i].to),low[x]=min(low[x],low[edge[i].to]);else if (visit[edge[i].to]) low[x]=min(dfn[edge[i].to],low[x]);if (dfn[x]==low[x]){int stp=0;scc++;while (x!=stp) stp=st[top--],size[scc]++,W[scc]+=w[stp],V[scc]+=v[stp],belong[stp]=scc,visit[stp]=0;}
}
inline void AddRoad(int u,int v) {tot++; road[tot].next=first[u]; first[u]=tot; road[tot].to=v;}
inline void InsertRoad(int u,int v) {AddRoad(u,v); AddRoad(v,u);}
bool flag[MAXN];
inline void Rebuild()
{for (int i=1; i<=N; i++)for (int j=head[i]; j; j=edge[j].next)if (belong[i]!=belong[edge[j].to])InsertRoad(belong[i],belong[edge[j].to]),flag[belong[edge[j].to]]=1;for (int i=1; i<=scc; i++) if (!flag[i]) InsertRoad(0,i);
}
int f[MAXN][MAXM],g[MAXN][MAXM];
void DP(int x,int last)
{    for (int i=first[x]; i; i=road[i].next)if (road[i].to!=last){DP(road[i].to,x);for (int j=M-W[x]; j>=0; j--)for (int k=0; k<j; k++)g[x][j]=max(g[x][j],g[x][k]+f[road[i].to][j-k]);}for (int i=0; i<=M-W[x]; i++) f[x][i+W[x]]=g[x][i]+V[x];
}
int main()
{N=read(),M=read();for (int i=1; i<=N; i++) w[i]=read();for (int i=1; i<=N; i++) v[i]=read();for (int f,i=1; i<=N; i++) f=read(),InsertEdge(f,i);for (int i=1; i<=N; i++) if (!dfn[i]) Tarjan(i);Rebuild();DP(0,0);printf("%d\n",f[0][M]);return 0;
}

 

转载于:https://www.cnblogs.com/DaD3zZ-Beyonder/p/5882604.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/256365.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop目录

1. 通过java读取HDFS的数据 (转&#xff09; 2. FLume监控文件夹&#xff0c;将数据发送给Kafka以及HDFS的配置文件详解 3. 开启hadoop和Hbase集群的lzo压缩功能&#xff08;转&#xff09; 4. Hadoop集群WordCount运行详解&#xff08;转&#xff09;转载于:https://www.cnblo…

相机标定(二)深入理解四大坐标系与其变换关系

一、前言 视觉系统一共有四个坐标系&#xff1a;像素平面坐标系&#xff08;u,v&#xff09;、图像坐标系&#xff08;x,y&#xff09;、相机坐标系&#xff08;Xc,Yc,Zc&#xff09;和世界坐标系&#xff08;Xw,Yw,Zw&#xff09;&#xff0c;如下图所示。每种坐标系之间均存…

numpy——ravel()和flatten()

目录 功能 用法 区别 flatten&#xff08;&#xff09; ravel() 功能 这两个函数的功能都是将多维数组转换成一维 用法 import numpy as np arr np.array([[1, 2],[3, 4]]) arr.flatten()降维默认行序优先&#xff0c;传入参数‘F’表示列序优先 arr.flatten(F) arr.r…

Django的model中日期字段设置默认值的问题

之前写过这样一个model&#xff1a; class MonthlyFeeMember(models.Model):worker models.ForeignKey(Student, verbose_nameu"worker", related_name"as_monthly_fee_members")month models.CharField(umonth, max_length10, defaultget_current_month…

相机标定(三) —— 畸变校正

一、前言 根据针孔模型&#xff0c;物体和成像之间参数会满足相似三角形的关系。但现实中会存在装配误差和透视失真等原因&#xff0c;导致这种关系无法成立&#xff0c;使理想成像与实际成像存在误差&#xff0c;这种误差即称为畸变。 畸变分为径向畸变&#xff0c;切向畸变和…

SVG技术入门:线条动画实现原理

相信大家都见到过这样神奇的技术&#xff1a;一副线条构成的画能自动画出自己。非常的酷。Jake Archibald是这种SVG技术的首创者&#xff0c;并且写了一篇非常好的文章来描述它是如何实现的。Brian Suda也在24 Ways网站上讨论过它。 Polygon使用它在一篇设计方面的文章里创造出…

机器学习——人工神经网络之BP算法编程(python二分类数据集:马疝病数据集)

目录 一、理论知识回顾 1、神经网络模型 2、明确任务以及参数 1&#xff09;待估参数&#xff1a; 2&#xff09;超参数&#xff1a; 3&#xff09;任务 3、神经网络数学模型定义 1&#xff09;激活函数 ​ 2&#xff09;各层权重、阈值定义 3&#xff09;各层输入输…

Halcon例程(基于多个标定图的单目相机标定)详解—— Camera_calibration_multi_image.hdev

一、前言 在我的工业相机专栏里已经将相机标定涉及到的理论部分讲解完毕&#xff0c;为什么要标定以及标定要求出什么参数呢&#xff0c;用一个Halcon 例程来帮助理解。 这个例程是比较经典的标定程序&#xff0c;基本将标定过程讲的比较清楚&#xff0c;用的标定图像是系统自…

SkipList 跳表

为什么选择跳表 目前经常使用的平衡数据结构有&#xff1a;B树&#xff0c;红黑树&#xff0c;AVL树&#xff0c;Splay Tree, Treep等。 想象一下&#xff0c;给你一张草稿纸&#xff0c;一只笔&#xff0c;一个编辑器&#xff0c;你能立即实现一颗红黑树&#xff0c;或者AVL树…

Redis failover过程

在Leader触发failover之前&#xff0c;首先wait数秒(随即0~5)&#xff0c;以便让其他sentinel实例准备和调整。如果一切正常&#xff0c;那么leader就需要开始将一个salve提升为master&#xff0c;此slave必须为状态良好(不能处于SDOWN/ODOWN状态)且权重值最低(redis.conf中)的…

机器学习——深度学习之卷积神经网络(CNN)——LeNet卷积神经网络结构

目录 一、卷积神经网络 1、卷积神经的作用 2、LeNet 1&#xff09;数据库准备——minst 2&#xff09;模型 二、关于卷积神经网络结构的一些术语定义 1、特征图&#xff08;Feature map&#xff09; 2、height&#xff08;长度&#xff09;、width&#xff08;宽度&…

工业相机(3D)主要参数详述

一、前言 准确的完成相机选型是一个视觉工程师必备的技能&#xff0c;而选型前必须对其内部参数了如指掌。工业相机是一种比较复杂的产品&#xff0c;其参数很多&#xff0c;每个参数可能会有不同的标准&#xff0c;下面对主要的参数会做比较详细的阐述。 二、参数详述 2.1 …

JAVA8永久代

在Java虚拟机&#xff08;以下简称JVM&#xff09;中&#xff0c;类包含其对应的元数据&#xff0c;比如类的层级信息&#xff0c;方法数据和方法信息&#xff08;如字节码&#xff0c;栈和变量大小&#xff09;&#xff0c;运行时常量池&#xff0c;已确定的符号引用和虚方法表…

Struts 2初体验

Struts2简介&#xff1a; Struts2是一个基于MVC设计模式的Web应用框架&#xff0c;它本质上相当于一个servlet&#xff0c;在MVC设计模式中&#xff0c;Struts2作为控制器(Controller)来建立模型与视图的数据交互。 Struts 2 目录结构:     apps目录&#xff1a;Struts2示例…

机器学习——深度学习之数据库和自编码器

目录 一、数据库——数据获取 1、Mnist 2、ImageNet 二、自编码器&#xff08;Auto-encoder&#xff09;——参数初始化 1、功能 2、基本思想 1&#xff09;训练第一层 2&#xff09;训练第二层及以后的神经网络 ​ 3&#xff09;利用BP对整个神经网络的参数初始值进…

Halcon例程详解 (深度图转换为3D图像)—— xyz_attrib_to_object_model_3d

一、前言 深度图向点云图进行转换是进行3D检测项目时会遇到的问题&#xff0c;halcon里也有针对此问题的相关例程&#xff0c;下面对此例程进行分析。通过学习此例程&#xff0c;我们可以掌握如何将一张深度图像和一张正常二维图像转换为3D点云。 二、分析 * 初始化界面 dev…

动态代理之Cglib浅析

什么是Cglib Cglib是一个强大的&#xff0c;高性能&#xff0c;高质量的代码生成类库。它可以在运行期扩展JAVA类与实现JAVA接口。其底层实现是通过ASM字节码处理框架来转换字节码并生成新的类。大部分功能实际上是ASM所提供的&#xff0c;Cglib只是封装了ASM&#xff0c;简化了…

机器学习——深度学习之卷积神经网络(CNN)——AlexNet卷积神经网络结构

目录 一、AlexNet卷积神经网络结构模型 1、数据库ImageNet 2、AlexNet第一层卷积层 二、AlexNet卷积神经网络的改进 1、非线性变化函数的改变——ReLU 2、最大池化&#xff08;Max Pooling&#xff09;概念的提出——卷积神经网络通用 1&#xff09;池化层 2&#xff0…

POJ - 3470 Walls

小鸟往四个方向飞都枚举一下&#xff0c;数据范围没给&#xff0c;离散以后按在其中一个轴线排序&#xff0c;在线段树上更新墙的id&#xff0c;然后就是点查询在在哪个墙上了。 这题有个trick&#xff0c;因为数据范围没给我老以为是inf设置小了&#xff0c;WA了很多发。&…

C# —— 深入理解委托类型

一. 委托定义 1. 委托与多播委托 委托类型表示对具有特定参数列表和返回类型的方法的引用&#xff0c;定义了委托实例可以调用的某类方法。 通过委托&#xff0c;我们可以动态的通过委托变量来调用委托方法。一般用delegate来命名委托类型,但Action和Func也可以达到同样的效果…