提炼:tarjan环缩成点,建0虚根,跑树形DP,最难的是看出可能有n个点n条边然后缩点,n个点n条边可能不只有一个环

n个点n条边->基环树:

基环树,也是环套树,简单地讲就是树上在加一条边。

既然成环就必定要么全选要么全不选,直接缩成一个点即可。

我的错误:

1.第二次建图时跑的第一次的邻接表

2.在读入时就建立了虚根0,但tarjan缩完后将环变成了孤点,建虚根毫无作用

结论:要在有实际意义的前提上对算法作出改进!不能有啥是啥!

Code

  1. #include<cstdio>
  2. using namespace std;
  3. const int N=;
  4. const int V=;
  5. int n,m,rt,num_bian,num_ibian,num_huan,num_tarjan,num_que,
  6. pw[N],pv[N],w[N],v[N],fm[N],to[N],head[N],nxt[N],ito[N],ihead[N],inxt[N],dfn[N],low[N],bel[N],que[N],in_que[N],dp[N][V],ru[N];
  7. void add(int x,int y){
  8. to[++num_bian]=y,fm[num_bian]=x,nxt[num_bian]=head[x],head[x]=num_bian;
  9. }
  10. void iadd(int x,int y){
  11. ito[++num_ibian]=y,inxt[num_ibian]=ihead[x],ihead[x]=num_ibian,ru[y]++;
  12. }
  13. int min(int x,int y){return x>y?y:x;}
  14. int max(int x,int y){return x>y?x:y;}
  15. void tarjan(int x){
  16. dfn[x]=low[x]=++num_tarjan;
  17. que[++num_que]=x;in_que[x]=;
  18. for(int i=head[x],y;i;i=nxt[i])
  19. if(!dfn[y=to[i]])tarjan(y),low[x]=min(low[x],low[y]);
  20. else if(in_que[y])low[x]=min(low[x],dfn[y]);
  21. if(dfn[x]==low[x]){
  22. ++num_huan;
  23. int y;
  24. do{
  25. y=que[num_que--];
  26. in_que[y]=;
  27. bel[y]=num_huan;
  28. }while(y!=x);
  29. }
  30. }
  31. void dfs(int x){
  32. for(int i=ihead[x],y;i;i=inxt[i]){
  33. dfs(y=ito[i]);
  34. for(int j=m;j>=;--j)for(int k=j;k;--k)
  35. dp[x][j]=max(dp[x][j],dp[x][j-k]+dp[y][k]);
  36. //printf("dp[%d][%d]=%d\n",x,j,dp[x][j]);
  37. }
  38. if(v[x]!=)for(int i=m;i;--i)
  39. if(i>=v[x])dp[x][i]=dp[x][i-v[x]]+w[x];
  40. else dp[x][i]=;
  41. }
  42. void debug(){
  43. for(int i=;i<=n;++i)printf("%d ",bel[i]);puts("");
  44. for(int i=num_huan;i;--i)printf(":%d %d ",w[i],v[i]);puts("");
  45. printf("%d\n",rt);
  46. }
  47. int main(){
  48. //freopen("text.in","r",stdin);
  49. //freopen("1.out","w",stdout);
  50. scanf("%d%d",&n,&m);
  51. for(int i=;i<=n;++i)scanf("%d",&pv[i]);for(int i=;i<=n;++i)scanf("%d",&pw[i]);for(int i=,x;i<=n;++i){scanf("%d",&x);if(x)add(x,i);}
  52. for(int i=;i<=n;++i)if(!dfn[i])tarjan(i);
  53. for(int i=;i<=num_bian;++i)if(bel[fm[i]]!=bel[to[i]])iadd(bel[fm[i]],bel[to[i]]);
  54. for(int i=;i<=n;++i)w[bel[i]]+=pw[i],v[bel[i]]+=pv[i];
  55. for(int i=;i<=num_huan;++i)if(!ru[i])iadd(,i);
  56. dfs();
  57. printf("%d\n",dp[][m]);
  58. //debug();
  59. return ;
  60. }

我还贴心的准备了对拍(Linux)代码(其实是我拍了2h呜呜呜)

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main(){
  4. for(int i=;i<=;++i){
  5. system("./1");
  6. system("./2");
  7. system("./rand");
  8. if(system("diff 1.out 2.out")){
  9. puts("Wrong Answer");return ;
  10. }
  11. else puts("Accepted");
  12. }
  13. }

pai.cpp

rand 代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=;
  4. int main(){
  5. freopen("text.in","w",stdout);
  6. srand((unsigned)time());
  7. int n=rand()%N+,m=rand()%N+;
  8. printf("%d %d\n",n,m);
  9. for(int i=;i<=n;++i){
  10. int v=rand()%n+;
  11. printf("%d ",v);
  12. }puts("");
  13. for(int i=;i<=n;++i){
  14. int w=rand()%n+;
  15. printf("%d ",w);
  16. }puts("");
  17. for(int i=,li;i<=n;++i){
  18. do
  19. li=rand()%n;
  20. while(li==i);
  21. printf("%d ",li);
  22. }puts("");
  23. }

rand.cpp

注:读入text.in,正解1.cpp,输出1.out,你的错解是2.cpp,输出2.out

还不快谢谢我!

软件安装:树上分组DP/tarjan缩点/(也许基环树?)的更多相关文章

  1. BZOJ_2427_[HAOI2010]软件安装_tarjan+树形DP

    BZOJ_2427_[HAOI2010]软件安装_tarjan+树形DP 题意: 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁 ...

  2. 【BZOJ2427】[HAOI2010]软件安装(动态规划,Tarjan)

    [BZOJ2427][HAOI2010]软件安装(动态规划,Tarjan) 题面 BZOJ 洛谷 题解 看到这类题目就应该要意识到依赖关系显然是可以成环的. 注意到这样一个性质,依赖关系最多只有一个, ...

  3. [BZOJ2427]:[HAOI2010]软件安装(塔尖+DP)

    题目传送门 题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用${W}_{i}$的磁盘空间,它的价值为${V}_{i}$.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件 ...

  4. 【Luogu】P2515软件安装(树形DP)

    题目链接 这么水的题我一遍没A,而且前两次提交都只有十分.气死我了.本来我的博客拒收水题来着. Tarjan缩点之后跑树形DP即可. #include<cstdio> #include&l ...

  5. HDU4612+Tarjan缩点+BFS求树的直径

    tarjan+缩点+树的直径题意:给出n个点和m条边的图,存在重边,问加一条边以后,剩下的桥的数量最少为多少.先tarjan缩点,再在这棵树上求直径.加的边即是连接这条直径的两端. /* tarjan ...

  6. hdu2242(树形dp+tarjan+缩点)

    hdu2242 http://acm.hdu.edu.cn/showproblem.php?pid=2242 给定n,m表示n个点,m条边 每个点有个权值 问我们删除两某条边(割边)后将图分为两个部分 ...

  7. [IOI2008/BZOJ1791 岛屿](处理基环树的小技巧&基于bfs树形DP)

    IOI2008/BZOJ1791 岛屿 题目大意是在一个基环树森林里求每一棵基环树的直径①的和. 其实就是树的直径的基环树升级版.我们先把环找出来,然后从环上的每一个节点x出发,并且不经过环上其他节点 ...

  8. bzoj 2427 [HAOI2010]软件安装 Tarjan缩点+树形dp

    [HAOI2010]软件安装 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2029  Solved: 811[Submit][Status][Dis ...

  9. 洛谷P2515 [HAOI2010]软件安装(tarjan缩点+树形dp)

    传送门 我们可以把每一个$d$看做它的父亲,这样这个东西就构成了一个树形结构 问题是他有可能形成环,所以我们还需要一遍tarjan缩点 缩完点后从0向所有入度为零的点连边 然后再跑一下树形dp就行了 ...

随机推荐

  1. Elasticsearch 6.2.3版本 filtered 报错问题 no [query] registered for [filtered]

    背景描述 近期在学习<Elasticsearch 权威指南>上的一些基本命令,在操作到 filtered 进行过滤查询的时候,报错 “no [query] registered for [ ...

  2. Session对象的生命周期(面试题/笔试题)

    创建:第一次执行request.getSession()时创建 销毁: 1)服务器(非正常)关闭时 2)session过期/失效(默认30分钟) 问题:时间的起算点 从何时开始计算30分钟? 从不操作 ...

  3. 【图形学手记】Inverse Transform Sampling 逆转换抽样

    需求: 我们通过调查,得知大多数人在20岁左右初恋,以20岁为基准,以随机变量X表示早于或晚于该时间的年数,为了简单,假设X值域为[-5,5],并且PDF(X)是一个正态分布函数(当然可以为任意分布, ...

  4. Salesforce学习之路-developer篇(五)一文读懂Aura原理及实战案例分析

    1. 什么是Lightning Component框架? Lightning Component框架是一个UI框架,用于为移动和台式设备开发Web应用程序.这是一个单页面Web应用框架,用于为Ligh ...

  5. 基于 vue2 + vuex 构建一个具有 45 个页面的大型单页面应用

    源码地址: https://github.com/bailicangdu/vue2-elm 技术栈 vue2 + vuex + vue-router + webpack + ES6/7 + fetch ...

  6. Appium - multiprocessing.pool.MaybeEncodingError-【 “Can’t pickle local object ‘PoolManager.__init__.<locals>.<lambda>‘】

    公司同事学习自动化新装环境后,run多进程测试用例时出错: multiprocessing.pool.MaybeEncodingError: Error sending result: ’<ap ...

  7. USACO1.6 Superprime Rib

    题目传送门 每一个特殊质数都会被从右边切掉,所以除了首位外的其它位数一定都不会是偶数,只能是$1$,$3$,$5$,$7$,$9$ 而每一个特殊质数的首位一定是质数,也就是$2$,$3$,$5$,$7 ...

  8. linux文件过多导致移动失败解决办法

    1. cd /sdzw/data/infogateftp/srcdata/ibp/account_rulelog ls | xargs  -t  -I  {}  mv {} /sdzw/data/in ...

  9. HDU 1263 水果 (STL map)

    水果 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submissi ...

  10. 基于Spark的电影推荐系统

    数据文件: u.data(userid  itemid  rating  timestamp) u.item(主要使用 movieid movietitle) 数据操作 把u.data导入RDD, t ...