热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【BZOJ2427】[HAOI2010]软件安装(缩点+树形DP)

点此看题面大致题意:有\(N\)个软件,每个软件有至多一个依赖以及一个所占空间大小\(W_i\),只有当一个软件的直接依赖和所有的间接依赖

点此看题面

大致题意:\(N\)个软件,每个软件有至多一个依赖以及一个所占空间大小\(W_i\),只有当一个软件的直接依赖和所有的间接依赖都安装了,它才能正常工作并造成\(V_i\)的价值。求在容量为\(M\)时的最大价值和。

大致思路

比较显然是树上背包。

但是,这题中可能会出现,因此我们要先用\(Tarjan\)来缩点。

还要注意,缩完点后的图是一个森林,因此我们需要再人为建一个根,将其向每棵树的根连一条边,这样就可以直接树形\(DP\)了。

主要是注意细节啊。

代码

#include
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
#define Gmax(x,y) (x<(y)&&(x&#61;(y)))
#define Gmin(x,y) (x>(y)&&(x&#61;(y)))
#define abs(x) ((x)<0?-(x):(x))
#define swap(x,y) (x^&#61;y^&#61;x^&#61;y)
#define uint unsigned int
#define LL long long
#define ull unsigned long long
#define INF 1000000000
#define N 100
#define M 500
#define add(x,y) (e[&#43;&#43;ee].nxt&#61;lnk[x],e[lnk[x]&#61;ee].to&#61;y)
using namespace std;
int n,m,ee,fa[N&#43;5],w[N&#43;5],v[N&#43;5],lnk[N&#43;5],deg[N&#43;5];
struct edge
{int to,nxt;
}e[N&#43;5];
class Class_FIO
{private:#define Fsize 100000#define tc() (A&#61;&#61;B&&(B&#61;(A&#61;Fin)&#43;fread(Fin,1,Fsize,stdin),A&#61;&#61;B)?EOF:*A&#43;&#43;)#define pc(ch) (void)(FoutSize}F;
class Class_Tarjan//Tarjan缩点
{private:int d,Top,dfn[N&#43;5],low[N&#43;5],Stack[N&#43;5],InStack[N&#43;5];public:int cnt,col[N&#43;5],Weight[N&#43;5],Val[N&#43;5];inline bool Vis(int x) {return dfn[x];}inline void Solve(int x,int lst&#61;0){register int i;for(dfn[x]&#61;low[x]&#61;&#43;&#43;d,InStack[Stack[&#43;&#43;Top]&#61;x]&#61;1,i&#61;lnk[x];i;i&#61;e[i].nxt){if(!dfn[e[i].to]) Solve(e[i].to,x),Gmin(low[x],low[e[i].to]);else if(InStack[e[i].to]) Gmin(low[x],dfn[e[i].to]);}if(dfn[x]^low[x]) return;Weight[col[x]&#61;&#43;&#43;cnt]&#61;w[x],Val[cnt]&#61;v[x],InStack[x]&#61;0;while(Stack[Top]^x) Weight[col[Stack[Top]]&#61;cnt]&#43;&#61;w[Stack[Top]],Val[cnt]&#43;&#61;v[Stack[Top]],InStack[Stack[Top--]]&#61;0;--Top;}inline void ReBuild()//重新建图{register int i;for(ee&#61;0,i&#61;1;i<&#61;n;&#43;&#43;i) lnk[i]&#61;0;//清空原先的边for(i&#61;1;i<&#61;n;&#43;&#43;i) col[fa[i]]^col[i]&&(add(col[fa[i]],col[i]),&#43;&#43;deg[col[i]]);//建新边for(i&#61;1;i<&#61;cnt;&#43;&#43;i) !deg[i]&&add(0,i);//将0号节点向每棵树的根连一条边}
}T;
class Class_TreeDP//树形DP求解树上背包
{private:int f[N&#43;5][M&#43;5],g[N&#43;5];inline void DP(int x){register int i,j,k,lim;for(i&#61;g[x]&#61;T.Weight[x];i<&#61;m;&#43;&#43;i) f[x][i]&#61;T.Val[x];for(i&#61;lnk[x];i;i&#61;e[i].nxt) for(DP(e[i].to),g[x]&#43;&#61;g[e[i].to],j&#61;min(m,g[x]);j>&#61;T.Weight[x];--j)for(k&#61;1,lim&#61;min(j-T.Weight[x],g[e[i].to]);k<&#61;lim;&#43;&#43;k) Gmax(f[x][j],f[x][j-k]&#43;f[e[i].to][k]);}public:inline void Solve() {DP(0),F.write(f[0][m]);}
}TreeDP;
int main()
{register int i;for(F.read(n),F.read(m),i&#61;1;i<&#61;n;&#43;&#43;i) F.read(w[i]);for(i&#61;1;i<&#61;n;&#43;&#43;i) F.read(v[i]);for(i&#61;1;i<&#61;n;&#43;&#43;i) F.read(fa[i]),fa[i]&&add(fa[i],i);for(i&#61;1;i<&#61;n;&#43;&#43;i) if(!T.Vis(i)) T.Solve(i);return T.ReBuild(),TreeDP.Solve(),F.clear(),0;
}

转:https://www.cnblogs.com/chenxiaoran666/p/BZOJ2427.html



推荐阅读
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文为Codeforces 1294A题目的解析,主要讨论了Collecting Coins整除+不整除问题。文章详细介绍了题目的背景和要求,并给出了解题思路和代码实现。同时提供了在线测评地址和相关参考链接。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 本文介绍了C++中的引用运算符及其应用。引用运算符是一种将变量定义为另一个变量的引用变量的方式,在改变其中一个变量时,两者均会同步变化。引用变量来源于数学,在计算机语言中用于储存计算结果或表示值抽象概念。变量可以通过变量名访问,在指令式语言中引用变量通常是可变的,但在纯函数式语言中可能是不可变的。本文还介绍了引用变量的示例及验证,以及引用变量在函数形参中的应用。当定义的函数使用引用型形参时,函数调用时形参的改变会同时带来实参的改变。 ... [详细]
author-avatar
雪狱冰魂_520
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有