洛谷 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

相关文章

如何在Mac上安装并配置JDK环境变量详细步骤

《如何在Mac上安装并配置JDK环境变量详细步骤》:本文主要介绍如何在Mac上安装并配置JDK环境变量详细步骤,包括下载JDK、安装JDK、配置环境变量、验证JDK配置以及可选地设置PowerSh... 目录步骤 1:下载JDK步骤 2:安装JDK步骤 3:配置环境变量1. 编辑~/.zshrc(对于zsh

如何在pycharm安装torch包

《如何在pycharm安装torch包》:本文主要介绍如何在pycharm安装torch包方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录在pycharm安装torch包适http://www.chinasem.cn配于我电脑的指令为适用的torch包为总结在p

在PyCharm中安装PyTorch、torchvision和OpenCV详解

《在PyCharm中安装PyTorch、torchvision和OpenCV详解》:本文主要介绍在PyCharm中安装PyTorch、torchvision和OpenCV方式,具有很好的参考价值,... 目录PyCharm安装PyTorch、torchvision和OpenCV安装python安装PyTor

Python Transformer 库安装配置及使用方法

《PythonTransformer库安装配置及使用方法》HuggingFaceTransformers是自然语言处理(NLP)领域最流行的开源库之一,支持基于Transformer架构的预训练模... 目录python 中的 Transformer 库及使用方法一、库的概述二、安装与配置三、基础使用:Pi

如何解决mmcv无法安装或安装之后报错问题

《如何解决mmcv无法安装或安装之后报错问题》:本文主要介绍如何解决mmcv无法安装或安装之后报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mmcv无法安装或安装之后报错问题1.当我们运行YOwww.chinasem.cnLO时遇到2.找到下图所示这里3.

Python 安装和配置flask, flask_cors的图文教程

《Python安装和配置flask,flask_cors的图文教程》:本文主要介绍Python安装和配置flask,flask_cors的图文教程,本文通过图文并茂的形式给大家介绍的非常详细,... 目录一.python安装:二,配置环境变量,三:检查Python安装和环境变量,四:安装flask和flas

Win11安装PostgreSQL数据库的两种方式详细步骤

《Win11安装PostgreSQL数据库的两种方式详细步骤》PostgreSQL是备受业界青睐的关系型数据库,尤其是在地理空间和移动领域,:本文主要介绍Win11安装PostgreSQL数据库的... 目录一、exe文件安装 (推荐)下载安装包1. 选择操作系统2. 跳转到EDB(PostgreSQL 的

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

MySQL Workbench 安装教程(保姆级)

《MySQLWorkbench安装教程(保姆级)》MySQLWorkbench是一款强大的数据库设计和管理工具,本文主要介绍了MySQLWorkbench安装教程,文中通过图文介绍的非常详细,对大... 目录前言:详细步骤:一、检查安装的数据库版本二、在官网下载对应的mysql Workbench版本,要是