[bzoj2427][HAOI2010]软件安装(树形dp+tarjan)
来源:互联网 发布:java堆栈溢出怎么解决 编辑:程序博客网 时间:2024/06/05 06:43
题目:
我是超链接
题解:
话说我一开始竟然用背包,woc太愚蠢了,儿子的权值和价值虽然保证了,但是很有可能和ta的父亲权值加重,看来得标准树形dp呢
f[i][j]表示以i为根的子树代价为j的最大权值,双层循环:j为子树x分配到的代价,k为子树v1[i]分配到的代价
为什么要单独拎出来一个in呢?如果这些点没有一个出来当根节点,就必须都连上0这个根。不加in的话就没有根啦
代码:
#include <cstdio>#include <iostream>#include <cstring>#define N 505using namespace std;int ww[N],vv[N],d[N],f[N][N],tot,nxt[N],point[N],v[N],tot1,nxt1[N],point1[N],v1[N];bool vis[N];int tmp,dfn[N],stack[N],low[N],nn,cnt,belong[N],hw[N],hv[N],x[N],y[N],m,in[N];void addline(int x,int y){++tot; nxt[tot]=point[x]; point[x]=tot; v[tot]=y;}void addline1(int x,int y){++tot1; nxt1[tot1]=point1[x]; point1[x]=tot1; v1[tot1]=y;}void tarjan(int x,int fa){ dfn[x]=low[x]=++nn; vis[x]=1; stack[++tmp]=x; for (int i=point[x];i;i=nxt[i]) if (!dfn[v[i]]) { tarjan(v[i],x); low[x]=min(low[x],low[v[i]]); }else if (vis[v[i]]) low[x]=min(low[x],dfn[v[i]]); if (low[x]==dfn[x]) { int now=0;cnt++; while (now!=x) { now=stack[tmp--]; vis[now]=0; belong[now]=cnt; hw[cnt]+=ww[now]; hv[cnt]+=vv[now]; } }}void treedp(int x){ for (int i=point1[x];i;i=nxt1[i]) { treedp(v1[i]); for (int j=m-hw[x];j>=0;j--) for (int k=0;k<=j;k++) f[x][j]=max(f[x][j],f[x][k]+f[v1[i]][j-k]); } for (int j=m;j>=0;j--) if (j>=hw[x]) f[x][j]=f[x][j-hw[x]]+hv[x]; else f[x][j]=0;}int main(){ int n,i,j; scanf("%d%d",&n,&m); for (i=1;i<=n;i++) scanf("%d",&ww[i]); for (i=1;i<=n;i++) scanf("%d",&vv[i]); for (i=1;i<=n;i++) { scanf("%d",&x[i]); y[i]=i; addline(x[i],i); } for (i=1;i<=n;i++) if (!dfn[i]) tarjan(i,0); for (i=1;i<=n;i++) if (x[i] && belong[x[i]]!=belong[y[i]]) addline1(belong[x[i]],belong[y[i]]),in[belong[y[i]]]++; for (i=1;i<=cnt;i++) if (!in[i]) addline1(0,i); treedp(0); printf("%d",f[0][m]);}
阅读全文
1 0
- [bzoj2427][HAOI2010]软件安装 Tarjan+树形DP
- [bzoj2427][HAOI2010]软件安装(树形dp+tarjan)
- [BZOJ2427][HAOI2010]软件安装(Tarjan+树形&背包DP)
- 【BZOJ2427】【HAOI2010】软件安装 tarjan+树形背包DP
- bzoj2427 [HAOI2010]软件安装 ( 树形背包 + tarjan )
- 【BZOJ2427】【树形DP】【Tarjan】 软件安装 题解
- 【bzoj2427】【HAOI2010】【软件安装】【缩点+dp】
- bzoj2427: [HAOI2010]软件安装
- 软件安装 [HAOI2010,Bzoj2427]
- BZOJ2427: [HAOI2010]软件安装
- 【bzoj2427】[HAOI2010]软件安装
- bzoj 2427: [HAOI2010]软件安装(tarjan缩点+树形dp)
- bzoj2427-tarjan+树形dp+背包
- BZOJ2427 软件安装 : Tarjan缩点 + 树形背包
- [BZOJ2427]软件安装-tarjan强连通+树形背包
- 【bzoj2427】【软件安装】tarjan缩点+树形依赖背包
- BZOJ2427 洛谷P2515 [HAOI2010]软件安装
- bzoj 2427: [HAOI2010]软件安装(Trajan+树形DP)
- 编写程序数一下 1到 100 的所有整数中出现多少次数字9。
- python爬虫实战笔记---selenium爬取QQ空间说说并存至本地(上)
- java---策略模式
- 跟我撩fastjson-第一章:认识fastjson
- 实验4:栈和队列的基本操作实现及其应用之《顺序栈》
- [bzoj2427][HAOI2010]软件安装(树形dp+tarjan)
- nodejs中流(stream)的理解
- linux 下时间字符串和time_t类型之间的相互转化
- Linux 参看cuda 及 显卡
- 模板的分离编译问题
- Chrome应用商店打不开解决方法
- Kubernetes Informer 详解
- $.ajax()方法学习笔记
- Tensorboard 可视化模板例子