E96 Tarjan缩点+树上背包 P2515 [HAOI2010] 软件安装

news/2025/2/3 22:24:11/文章来源:https://www.cnblogs.com/dx123/p/18697061

视频链接:

 

 

参考1:D14【模板】强连通分量 Tarjan 算法 - 董晓 - 博客园

参考2:E76 树上背包 P1064 [NOIP2006 提高组] 金明的预算方案 - 董晓 - 博客园

P2515 [HAOI2010] 软件安装 - 洛谷 | 计算机科学教育新生态

// Tarjan缩点+树上背包 O(n*m)
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
using namespace std;const int N=505;
struct E{int y,ne;}e[N<<1];
int head[N],idx;
void add(int x,int y){e[++idx]={y,head[x]};head[x]=idx;
}
int n,m,w[N],v[N],d[N];
int dfn[N],low[N],tim,scc[N],cnt,stk[N],top;
int W[N],V[N],ind[N],f[N][N];void tarjan(int x){dfn[x]=low[x]=++tim;stk[++top]=x;for(int i=head[x];i;i=e[i].ne){int y=e[i].y;if(!dfn[y]){ //若y未访问
      tarjan(y);low[x]=min(low[x],low[y]);} else if(!scc[y]) //若y已访问且未处理low[x]=min(low[x],dfn[y]);}if(dfn[x]==low[x]){++cnt;while(1){int y=stk[top--];scc[y]=cnt;W[cnt]+=w[y];V[cnt]+=v[y];if(y==x) break;}}
}
void dfs(int x){for(int i=head[x];i;i=e[i].ne){int y=e[i].y;for(int j=0;j<=m-W[y];j++)f[y][j]=f[x][j]+V[y];dfs(y);for(int j=W[y];j<=m;j++)f[x][j]=max(f[x][j],f[y][j-W[y]]);}
}
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]);if(d[i])add(d[i],i);}for(int i=1;i<=n;i++) //缩点if(!dfn[i]) tarjan(i);for(int i=1;i<=n;i++) head[i]=0;idx=0;for(int i=1;i<=n;i++) //连边if(scc[d[i]]!=scc[i])add(scc[d[i]],scc[i]),ind[scc[i]]++;for(int i=1;i<=cnt;i++) //变成树if(!ind[i]) add(0,i);dfs(0); //DPprintf("%d\n",f[0][m]);
}

 

 

// Tarjan缩点+树上背包 未优化 O(n*m*m)
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
using namespace std;const int N=505;
struct E{int y,ne;}e[N<<1];
int head[N],idx;
void add(int x,int y){e[++idx]={y,head[x]};head[x]=idx;
}
int n,m,w[N],v[N],d[N];
int dfn[N],low[N],tim,scc[N],cnt,stk[N],top;
int W[N],V[N],ind[N],f[N][N];void tarjan(int x){dfn[x]=low[x]=++tim;stk[++top]=x;for(int i=head[x];i;i=e[i].ne){int y=e[i].y;if(!dfn[y]){ //若y未访问
      tarjan(y);low[x]=min(low[x],low[y]);} else if(!scc[y]) //若y已访问且未处理low[x]=min(low[x],dfn[y]);}if(dfn[x]==low[x]){++cnt;while(1){int y=stk[top--];scc[y]=cnt;W[cnt]+=w[y];V[cnt]+=v[y];if(y==x) break;}}
}
void dfs(int x){for(int i=W[x];i<=m;i++)f[x][i]=V[x];for(int i=head[x];i;i=e[i].ne){int y=e[i].y;dfs(y);for(int j=m;j>=W[x];j--) //体积for(int k=0;k<=j-W[x];k++) //决策f[x][j]=max(f[x][j],f[x][j-k]+f[y][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]);if(d[i])add(d[i],i);}for(int i=1;i<=n;i++) //缩点if(!dfn[i]) tarjan(i);for(int i=1;i<=n;i++) head[i]=0;idx=0;for(int i=1;i<=n;i++) //连边if(scc[d[i]]!=scc[i])add(scc[d[i]],scc[i]),ind[scc[i]]++;for(int i=1;i<=cnt;i++) //变成树if(!ind[i]) add(0,i);dfs(0); //DPprintf("%d\n",f[0][m]);
}

 

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

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

相关文章

verilog 编写猫狗过河实验

使用verilog语言在FPGA上完成猫狗过河游戏开发。源代码地址:https://github.com/penggeon/catanddog效果演示见: https://www.bilibili.com/video/BV1n24y147S1警告: 仅给出了实验过程的源代码,需手动复制粘贴至自己项目中。 主模块默认名为 catanddog,若需使用请自行修改。…

7.sql注入.md

注入的本质:sql:把用户输入的数据当做sql代码执行XSS:用户输入的数据当做前端代码执行XXE:用户输入的数据当做XML代码执行代码执行:用户输入的数据当做后端代码执行命令执行:用户输入的数据当做系统命令执行sql关键点:1.用户能够控制输入----存在注入点2.原本程序要执行…

2025-1-22-28-进度汇报

一边玩一边写确实慢,更不用说一天就写一点点,不过大致框架出来了,登录功能就是我21号的,下边呢我们主要是主界面还有一些功能 这是登录之后首页的界面,只有展示,其他毛都没有,未来希望我能把它做的更有功能性一点这是评估页面,我有三个角色,用户,也就是需要被评估的,…

来自aakennes的新年祝福(欢乐赛)

来自aakennes的新年祝福(欢乐赛) A. 字符串会上树 直接模拟。 (因为没关 freopen 吃了 10 发罚时) B. 挖宝石 直接上 bitset 即可,对于不是 0 的限制,多记一个 $ k $ 即可,最后看 $ k $ 不是看 $ 0 $ 。 C. 电梯系统 考虑每多一层,该层就要向前每层连一条边,而有的边可以…

2策略模式

设计模式之策略模式策略 + 工厂 package strategy; public abstract class Strategy {public abstract double getResult(); }package strategy;public class StrategyA extends Strategy{@Overridepublic double getResult() {System.out.println("策略A实现了");re…

CF996

A link如果两只小动物只往中间跳的话,那么中间间隔奇数个就是另一个小动物赢(一定会出现两个小动物挨着而该爱丽丝跳了),否则就是爱丽丝赢(一定会出现两个小动物挨着而改另一个动物跳了)。 那么我们可以发现,两个小动物只会往中间跳,因为往边上跳跳出去再跳回来一定是偶…

八. Spring Boot2 整合连接 Redis(超详细剖析)

八. Spring Boot2 整合连接 Redis(超详细剖析) @目录八. Spring Boot2 整合连接 Redis(超详细剖析)2. 注意事项和细节3. 最后:在 springboot 中 , 整合 redis 可以通过 RedisTemplate 完成对 redis 的操作, 包括设置数据/获取数据 比如添加和读取数据 具体整合实现:创建…

4G【切换】常用公式

本文来自博客园,作者:{IceSparks},转载请注明原文链接:https://www.cnblogs.com/IceSparks/p/18697740

4G与5G常用频点

本文来自博客园,作者:{IceSparks},转载请注明原文链接:https://www.cnblogs.com/IceSparks/p/18697735

4G与5G网络架构

本文来自博客园,作者:{IceSparks},转载请注明原文链接:https://www.cnblogs.com/IceSparks/p/18697738

【前端】常用VsCode插件

根据插件的功能和用途,可以将这些 VSCode 插件分为以下几类,并进行排序: 1. 代码编辑与格式化Prettier - Code formatter自动格式化代码,支持多种语言。Prettier ESLint集成 Prettier 和 ESLint,统一代码风格。ESLint提供 JavaScript 和 TypeScript 的代码质量检查。Style…