传送门

树形dp

对于每个点维护其子节点的走法是否唯一,每次取最大的并且不为负的(停留次数-1)个子儿子权值,然后判断走法是否唯一

假如有子节点的权值为0,走法也不唯一

代码:

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<vector>
  5. #include<cstring>
  6. using namespace std;
  7. void read(int &x) {
  8. char ch;bool ok;
  9. for(ok=0,ch=getchar(); !isdigit(ch); ch=getchar()) if(ch=='-') ok=1;
  10. for(x=0; isdigit(ch); x=x*10+ch-'0',ch=getchar());
  11. if(ok) x=-x;
  12. }
  13. #define rg register
  14. const int maxn=1e5+10;
  15. vector<pair<int,int> >s[maxn];
  16. int n,m,f[maxn],pre[maxn*2],nxt[maxn*2],h[maxn],a[maxn],b[maxn],cnt,top;bool g[maxn];
  17. void add(int x,int y)
  18. {
  19. pre[++cnt]=y,nxt[cnt]=h[x],h[x]=cnt;
  20. pre[++cnt]=x,nxt[cnt]=h[y],h[y]=cnt;
  21. }
  22. void dfs(int x,int fa)
  23. {
  24. f[x]=a[x];g[x]=0;b[x]--;
  25. if(!b[x])return ;
  26. for(rg int i=h[x];i;i=nxt[i])
  27. if(pre[i]!=fa)dfs(pre[i],x),s[x].push_back(make_pair(f[pre[i]],g[pre[i]]));
  28. sort(s[x].begin(),s[x].end());int now=0,t=s[x].size();
  29. for(rg int i=1;i<=b[x];i++)
  30. {
  31. if(now==t||s[x][t-now-1].first<0)break;
  32. if(!s[x][t-now-1].first)g[x]=1;
  33. else g[x]|=s[x][t-now-1].second,f[x]=f[x]+s[x][t-now-1].first;
  34. now++;
  35. }
  36. }
  37. int main()
  38. {
  39. read(n);b[1]=1e9;
  40. for(rg int i=2;i<=n;i++)read(a[i]);
  41. for(rg int i=2;i<=n;i++)read(b[i]);
  42. for(rg int i=1,x,y;i<n;i++)read(x),read(y),add(x,y);
  43. dfs(1,0),printf("%d\n",f[1]);
  44. if(g[1])printf("solution is not unique\n");
  45. else printf("solution is unique\n");
  46. }

bzoj4472:[Jsoi2015]salesman的更多相关文章

  1. 【题解】 bzoj4472: [Jsoi2015]salesman (动态规划)

    bzoj4472,懒得复制,戳我戳我 Solution: 题面意思:从\(1\)号节点出发,每到一个节点就必须停下,获得节点权值(每个节点只会获得一次),每个点有个规定的停留次数,求最大可获得多大权值 ...

  2. bzoj4472: [Jsoi2015]salesman(树形dp)

    Description 某售货员小T要到若干城镇去推销商品,由于该地区是交通不便的山区,任意两个城镇之间都只有唯一的可能经过其它城镇的路线. 小T 可以准确地估计出在每个城镇停留的净收益.这些净收益可 ...

  3. BZOJ 4472 [Jsoi2015]salesman(树形DP)

    4472: [Jsoi2015]salesman Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 417  Solved: 192[Submit][St ...

  4. 题解【BZOJ4472】[JSOI2015]salesman

    题面 树形\(\text{DP}\)与贪心的结合. 首先考虑树形\(\text{DP}\). 设\(dp_i\)表示从\(i\)出发,访问\(i\)的子树,并且最后回到\(i\)能获得的最大收益. 转 ...

  5. 【BZOJ4472】salesman(树形DP)

    题意: 给定一颗有点权的树,每个树上的节点最多能走到lim[u]次,求一条路径,使路径上的点权和最大,每个节点上的点权如果走了多次只能算一次.还要求方案是否唯一. 思路:每个点只能取lim[u]-1个 ...

  6. bzoj 4472: [Jsoi2015]salesman【树形dp+贪心】

    一个点,设f[u]为要取最大值显然是前最大停留次数-1个儿子的正数f和,排个序贪心即可 判重的话就是看没选的里面是否有和选了的里面f值相同的,有的话就是一.注意在选的时候要把加进f的儿子的g合并上去 ...

  7. 洛谷 P6082 [JSOI2015]salesman

    题意 给定一棵\(n\)个点的树,有点权,你从\(1\)号点开始一次旅行,最后回到\(1\)号点.每到达一个点,你就能获得等于该点点权的收益, 但每个点都有进入该点的次数限制,且每个点的收益只能获得一 ...

  8. JSOI2015 Salesman(树型DP)

    [luogu6082] [题目描述] 某售货员小T要到若干城镇去推销商品,由于该地区是交通不便的山区,任意两个城镇之间都只有唯一的可能经过其它城镇的路线. 小T 可以准确地估计出在每个城镇停留的净收益 ...

  9. [暑假的bzoj刷水记录]

    (这篇我就不信有网站来扣) 这个暑假打算刷刷题啥的 但是写博客好累啊  堆一起算了 隔一段更新一下.  7月27号之前刷的的就不写了 , 写的累 代码不贴了,可以找我要啊.. 2017.8.27upd ...

随机推荐

  1. LVS集群的负载调度

    LVS集群的负载调度 章文嵩 (wensong@linux-vs.org) 转自LVS官方资料 2002 年 5 月 本文主要讲述了LVS集群的IP负载均衡软件IPVS在内核中实现的各种连接调度算法. ...

  2. ping请求超时的解决方法

    我们有时需要进行远程或者共享对方数据库的时候,会ping一下对方电脑,时候能够ping通,时候能够进行数据的传输.有时会出现ping请求超时,那么遇到这个问题该怎么解决? 我们首要解决的是看他自己是否 ...

  3. Android Dalvik虚拟机

    虽然Android平台使用Java来开发应用程序,但Android程序却不是运行在标准Java虚拟机上的. 可能是出于效率和版权的考虑,Google为Android专门设计了一套虚拟机Dalvik V ...

  4. cogs1070玻璃球游戏

    1070. [焦作一中2012] 玻璃球游戏 ★   输入文件:marbles.in   输出文件:marbles.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 小x ...

  5. Tomcat 安装之后,双击Tomcat.exe,无法运行成功,怎么办?

    Log形式多种多样,有的时候跟下面一样: 首先的解决方案就是:修改server.xml中所有的端口,因为不只8080端口可能被占用! 我在出问题的时候就修改8080端口.结果死活运行不了,纠结一些时间 ...

  6. kitti 数据集解析

    1.KITTI数据集采集平台: KITTI数据采集平台包括2个灰度摄像机,2个彩色摄像机,一个Velodyne 3D激光雷达,4个光学镜头,以及1个GPS导航系统.坐标系转换原理参见click.KIT ...

  7. bzoj4804

    莫比乌斯反演 我不会推线性筛 留坑

  8. 关于layer.open() 弹框的使用

    在用 layer.open() 追加渲染HTML的时候,完全看不到效果,皆因layui框架需要在最后用 form.render() 方法来渲染表单才可以看到效果,写法如下: <script> ...

  9. C# 获取点击列的索引

    datagridview 怎么获取选中行的某一列的索引比如 下面是表学号 姓名 所在年级 1    张     高一 2    李     高二当我选择第二行的时候 我想取所在年级的列索引 这时候那个 ...

  10. initWithFrame 与 initWithCoder 、awakeFromNib 的方法理解笔记

    1. initWithFrame方法是什么? initWithFrame方法用来初始化并返回一个新的视图对象,根据指定的CGRect(尺寸). 当然,其他UI对象,也有initWithFrame方法, ...