洛谷 P2515 软件安装 —— tarjan + 树形背包

2023-11-02 10:32

本文主要是介绍洛谷 P2515 软件安装 —— tarjan + 树形背包,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:点我啊╭(╯^╰)╮

题目大意:

    每个点有重量、价值、依赖点
    树形背包模型,求体积为 M M M 的背包的最大值

解题思路:

    注意根据依赖点建图后不是树和森林
    因为会形成环,环上的点要么都选,要么都不选
    因此 t a r j a n tarjan tarjan 缩点后跑一下树形背包即可
    这里用了 d f s dfs dfs 序的 O ( n w ) O(nw) O(nw) 算法
     n a m o namo namo 为什么 P2014 [CTSC1997]选课 这道题就是森林而不会形成环呢?
    注意数组越界报wa会多折腾几个小时

#include<bits/stdc++.h>
#define rint register int
#define deb(x) cerr<<#x<<" = "<<(x)<<'\n';
using namespace std;
typedef long long ll;
typedef pair <int,int> pii;
const int maxn = 2e3 + 5;
int n, m, d[maxn], w[maxn], v[maxn]; 
int nw[maxn], nv[maxn], nw2[maxn], nv2[maxn];
int dfn[maxn], low[maxn], vis[maxn], col[maxn];
int s[maxn], top, tot, numc, nxt[maxn];
int dp[maxn][505], in[maxn];
vector <int> g[maxn];void tarjan(int u){dfn[u] = low[u] = ++tot;s[++top] = u;vis[u] = 1;for(auto v : g[u]){if(!dfn[v]){tarjan(v);low[u] = min(low[u], low[v]);} else if(vis[v]) low[u] = min(low[u], dfn[v]);}if(dfn[u] == low[u]){++numc;while(s[top+1] ^ u){col[s[top]] = numc;nw[numc] += w[s[top]]; nv[numc] += v[s[top]]; vis[s[top--]] = 0;}}
}void dfs(int u){dfn[u] = tot++;for(auto v : g[u]) dfs(v);nxt[dfn[u]] = tot;
}signed 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);if(d[i]) g[d[i]].push_back(i);}for(int i=1; i<=n; i++)if(!dfn[i]) tarjan(i);for(int i=0; i<=n; i++) g[i].clear();for(int i=1; i<=n; i++)if(col[i] ^ col[d[i]] && d[i]) g[col[d[i]]].push_back(col[i]), in[col[i]]++;for(int i=1; i<=numc; i++)if(!in[i]) g[0].push_back(i);dfs(tot = 0);memset(dp, 128, sizeof(dp));memset(dp[0], 0, sizeof(dp[0]));for(int i=1; i<=numc; i++) nw2[dfn[i]] = nw[i];for(int i=1; i<=numc; i++) nv2[dfn[i]] = nv[i];for(int i=0; i<=numc; i++)for(int j=0; j<=m; j++){dp[nxt[i]][j] = max(dp[nxt[i]][j], dp[i][j]);if(j + nw2[i] > m) continue; dp[i+1][j+nw2[i]] = max(dp[i+1][j+nw2[i]], dp[i][j] + nv2[i]);}printf("%d\n", dp[numc+1][m]);
}

这篇关于洛谷 P2515 软件安装 —— tarjan + 树形背包的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/329995

相关文章

RabbitMQ 延时队列插件安装与使用示例详解(基于 Delayed Message Plugin)

《RabbitMQ延时队列插件安装与使用示例详解(基于DelayedMessagePlugin)》本文详解RabbitMQ通过安装rabbitmq_delayed_message_exchan... 目录 一、什么是 RabbitMQ 延时队列? 二、安装前准备✅ RabbitMQ 环境要求 三、安装延时队

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境

Python库 Django 的简介、安装、用法入门教程

《Python库Django的简介、安装、用法入门教程》Django是Python最流行的Web框架之一,它帮助开发者快速、高效地构建功能强大的Web应用程序,接下来我们将从简介、安装到用法详解,... 目录一、Django 简介 二、Django 的安装教程 1. 创建虚拟环境2. 安装Django三、创

linux安装、更新、卸载anaconda实践

《linux安装、更新、卸载anaconda实践》Anaconda是基于conda的科学计算环境,集成1400+包及依赖,安装需下载脚本、接受协议、设置路径、配置环境变量,更新与卸载通过conda命令... 目录随意找一个目录下载安装脚本检查许可证协议,ENTER就可以安装完毕之后激活anaconda安装更

Jenkins的安装与简单配置过程

《Jenkins的安装与简单配置过程》本文简述Jenkins在CentOS7.3上安装流程,包括Java环境配置、RPM包安装、修改JENKINS_HOME路径及权限、启动服务、插件安装与系统管理设置... 目录www.chinasem.cnJenkins安装访问并配置JenkinsJenkins配置邮件通知

SpringBoot利用树形结构优化查询速度

《SpringBoot利用树形结构优化查询速度》这篇文章主要为大家详细介绍了SpringBoot利用树形结构优化查询速度,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一个真实的性能灾难传统方案为什么这么慢N+1查询灾难性能测试数据对比核心解决方案:一次查询 + O(n)算法解决

Win10安装Maven与环境变量配置过程

《Win10安装Maven与环境变量配置过程》本文介绍Maven的安装与配置方法,涵盖下载、环境变量设置、本地仓库及镜像配置,指导如何在IDEA中正确配置Maven,适用于Java及其他语言项目的构建... 目录Maven 是什么?一、下载二、安装三、配置环境四、验证测试五、配置本地仓库六、配置国内镜像地址

Python安装Pandas库的两种方法

《Python安装Pandas库的两种方法》本文介绍了三种安装PythonPandas库的方法,通过cmd命令行安装并解决版本冲突,手动下载whl文件安装,更换国内镜像源加速下载,最后建议用pipli... 目录方法一:cmd命令行执行pip install pandas方法二:找到pandas下载库,然后

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

SQL Server安装时候没有中文选项的解决方法

《SQLServer安装时候没有中文选项的解决方法》用户安装SQLServer时界面全英文,无中文选项,通过修改安装设置中的国家或地区为中文中国,重启安装程序后界面恢复中文,解决了问题,对SQLSe... 你是不是在安装SQL Server时候发现安装界面和别人不同,并且无论如何都没有中文选项?这个问题也