Luogu P2515

这道题的题面与P2146有点像。一些不同地方就是P2146是无环的,这题是有环的。

很显然,如果有几个软件的依赖关系形成环,那么这几个软件就可以被看成是一个大软件,其价值和空间都是原先的总和。

那么,我们就可以利用Tarjan算法求强连通分量+缩点,最后加一个树上的背包就可以了。

注意,缩点后的图不一定是一棵树,但是我们可以人为的加入一个权值为零的根节点,连接所有入度为0的点。

有关Tarjan算法和强连通分量:

【Luogu P3387】缩点模板(强连通分量Tarjan&拓扑排序)

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int maxn=110,maxm=510;
int dfn[maxn],low[maxn],stk[maxn],cnt,tim,d[maxn],tot,sccw[maxn],sccv[maxn];
int w[maxn],v[maxn],scc[maxn],in[maxn],ohead[maxn],ocnt,m,n,head[maxn],dp[maxn][maxm],ans;
struct data
{
int to,next;
}oe[maxn],e[maxn];
bool vis[maxn];
void Tarjan(int now)
{
dfn[now]=low[now]=++tim;
stk[++cnt]=now;
vis[now]=true;
for (int i=head[now];i;i=e[i].next)
{
if (!dfn[e[i].to])
{
Tarjan(e[i].to);
low[now]=min(low[now],low[e[i].to]);
}
else
{
if (vis[e[i].to]) low[now]=min(low[now],dfn[e[i].to]);
}
}
if (dfn[now]==low[now])
{
tot++;
while (true)
{
scc[stk[cnt]]=tot;
sccv[tot]+=v[stk[cnt]];
sccw[tot]+=w[stk[cnt]];
vis[stk[cnt]]=false;
cnt--;
if (stk[cnt+1]==now) break;
}
}
}
void dfs(int now)//树上背包
{
//基本思路如下:枚举子树能取的空间,再利用01背包的原理进行状态转移。
//还有一种方法可以把多叉树转化成二叉树,按照左儿子又兄弟的原则重新建树。实现起来比较麻烦,所以没写。
for (int i=sccw[now];i<=m;i++) dp[now][i]=sccv[now];//初始值
for (int i=ohead[now];i;i=oe[i].next)
{
int to=oe[i].to;
dfs(to);
for (int j=m-sccw[now];j>=0;j--)
{
for (int k=0;k<=j;k++)
dp[now][j+sccw[now]]=max(dp[now][j+sccw[now]],dp[now][j+sccw[now]-k]+dp[to][k]);
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++) scanf("%d",&w[i]);
for (int i=1;i<=n;i++) scanf("%d",&v[i]);
for (int i=1;i<=n;i++)
{
scanf("%d",&d[i]);
e[i].to=i;
e[i].next=head[d[i]];
head[d[i]]=i;
//注意建边的方向。
}
cnt=0;
for (int i=1;i<=n;i++) if (!dfn[i]) Tarjan(i);
ocnt=0;
for (int i=1;i<=n;i++)
for (int j=head[i];j;j=e[j].next)
if (scc[i]!=scc[e[j].to])
{
oe[++ocnt].to=scc[e[j].to];
oe[ocnt].next=ohead[scc[i]];
ohead[scc[i]]=ocnt;
in[scc[e[j].to]]++;//统计入度
}
tot++;//人为加入的根节点
for (int i=1;i<tot;i++)
if (in[i]==0)
{
oe[++ocnt].to=i;
oe[ocnt].next=ohead[tot];
ohead[tot]=ocnt;//连边。
}
dfs(tot);
printf("%d\n",dp[tot][m]);
return 0;
}

【Luogu P2515】软件安装的更多相关文章

  1. Libre 6009 「网络流 24 题」软件补丁 / Luogu 2761 软件安装问题 (最短路径,位运算)

    Libre 6009 「网络流 24 题」软件补丁 / Luogu 2761 软件安装问题 (最短路径,位运算) Description T 公司发现其研制的一个软件中有 n 个错误,随即为该软件发放 ...

  2. 【Luogu】P2515软件安装(树形DP)

    题目链接 这么水的题我一遍没A,而且前两次提交都只有十分.气死我了.本来我的博客拒收水题来着. Tarjan缩点之后跑树形DP即可. #include<cstdio> #include&l ...

  3. luogu P2515 [HAOI2010]软件安装 |Tarjan+树上背包

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

  4. 洛谷 P2515 [HAOI2010]软件安装 解题报告

    P2515 [HAOI2010]软件安装 题目描述 现在我们的手头有\(N\)个软件,对于一个软件\(i\),它要占用\(W_i\)的磁盘空间,它的价值为\(V_i\).我们希望从中选择一些软件安装到 ...

  5. Tarjan+树形DP【洛谷P2515】[HAOI2010]软件安装

    [洛谷P2515][HAOI2010]软件安装 题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得 ...

  6. 洛谷——P2515 [HAOI2010]软件安装

    https://www.luogu.org/problem/show?pid=2515#sub 题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中 ...

  7. 【洛谷P2515【HAOI2010】】软件安装

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

  8. 洛谷—— P2515 [HAOI2010]软件安装

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

  9. 洛谷 P2515 [HAOI2010]软件安装

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

随机推荐

  1. springboot整合Shiro功能案例

    Shiro 核心功能案例讲解 基于SpringBoot 有源码 从实战中学习Shiro的用法.本章使用SpringBoot快速搭建项目.整合SiteMesh框架布局页面.整合Shiro框架实现用身份认 ...

  2. Redis(十五)Redis 的一些常用技术(Spring 环境下)

    一.Redis 事务与锁机制 1.Redis的基础事务 在Redis中开启事务的命令是 multi 命令, 而执行事务的命令是 exec 命令.multi 到 exec 命令之间的 Redis 命令将 ...

  3. vue条件渲染2

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. SpringCloud之异常报警通知(八)

    在之前整合降级的基础上,整合redis,达到报警的效果(redis的启动还是之前boot里面整合的redis) order-service pom.xml <dependency> < ...

  5. 【aliyun】学java,看这里,不迷茫!1460道Java热门问题

    阿里极客公益活动: 或许你挑灯夜战只为一道难题 或许你百思不解只求一个答案 或许你绞尽脑汁只因一种未知 那么他们来了,阿里系技术专家来云栖问答为你解答技术难题了 他们用户自己手中的技术来帮助用户成长 ...

  6. 学习笔记04IIS

    IIS机制:1.能监听端口,获取socket的客户端对象2.获取请求报文,将请求报文变成对象.3.处理请求报文,通过HttpApplication.ProcessRequest方法来处理HttpCon ...

  7. Java类、对象、变量、方法

    对象:有状态和行为.例如,一条狗是一个对象,它的状态有:颜色.名字.品种:行为有:摇尾巴.叫.吃等 类:类是一个模板,描述一类对象的行为和状态 对象的行为通过方法来体现,状态就是对象的属性,变量可以是 ...

  8. CSPS模拟 75

    我身边 mikufun:矩阵树学学学 Lrefrain:矩阵题刷刷刷 Dybala:神仙定理康康康 skyh:讨论讨论讨论(most mei face) DeepinC:我过样例了! Mouding: ...

  9. 同余类BFS的一些瞎吹

    同余类BFS的题,是个OIer基本上都会见过一些,最好的例子就是NOIP 2018 day1  T2---货币系统 虽然这题其实是什么背包就能解决的题目,但数据一变大,出题人坏一点,就没了.... 同 ...

  10. 『题解』洛谷P1083 借教室

    更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Portal3: Vijos Description 在大学期间,经常需要租借教室.大到院系举办活动,小到 ...