某售货员小T要到若干城镇去推销商品,由于该地区是交通不便的山区,任意两个城镇

之间都只有唯一的可能经过其它城镇的路线。 小T 可以准确地估计出在每个城镇停留的净收

益。这些净收益可能是负数,即推销商品的利润抵不上花费。由于交通不便,小T经过每个

城镇都需要停留,在每个城镇的停留次数与在该地的净收益无关,因为很多费用不是计次收

取的,而每个城镇对小T的商品需求也是相对固定的,停留一次后就饱和了。每个城镇为了

强化治安,对外地人的最多停留次数有严格的规定。请你帮小T 设计一个收益最大的巡回方

案,即从家乡出发,在经过的每个城镇停留,最后回到家乡的旅行方案。你的程序只需输出

最大收益,以及最优方案是否唯一。方案并不包括路线的细节,方案相同的标准是选择经过

并停留的城镇是否相同。因为取消巡回也是一种方案,因此最大收益不会是负数。小T 在家

乡净收益是零,因为在家乡是本地人,家乡对小 T当然没有停留次数的限制。

树上贪心

dp[x],表示以x为根的子树的最大值,g[x]表示dp[x]确定最大时,是否出现方案有多个(只要判断最优方案中某个可选的do值为0)

每层维护一个堆,将dp[y],g[y],扔进堆中,取前cnt[x] - 1个,直到有0出现为止

code:

#include <cstring>
#include <cstdio>
#include <iostream>
#include <queue> using namespace std; const int MAXX = 100100; int hed[MAXX], ver[MAXX << 1], nxt[MAXX << 1], val[MAXX], cnt[MAXX], dp[MAXX];
bool g[MAXX];
int n, tot; inline void add(int x, int y) {
ver[++tot] = y;
nxt[tot] = hed[x];
hed[x] = tot;
}
inline void dfs(int x,int f) {
priority_queue<pair<int ,int > > q;
for (int i = hed[x]; i; i = nxt[i]) {
int y = ver[i];
if (y == f) continue;
dfs (y, x);
q.push(make_pair(dp[y],g[y]));
}
int num = 0;
int now = 0;
bool flag = 0;
while (!q.empty() && num < cnt[x] - 1) {
if(q.top().first < 0) break;
else if (q.top().first == 0) {
flag |= 1;
break;
}else {
now += q.top().first;
flag |= q.top().second;
}
q.pop();
num++;
}
dp[x] = now + val[x]; g[x] = flag;
}
int main() {
scanf("%d", &n);
cnt[1] = 1e9;
for (int i = 2; i <= n; ++i) scanf("%d", &val[i]);
for (int i = 2; i <= n; ++i) scanf("%d", &cnt[i]);
for (int i = 1; i < n; ++i) {
int x, y;
scanf("%d%d", &x, &y);
add(x, y);
add(y, x);
}
dfs(1, 0);
printf("%d\n",dp[1]);
if (g[1] == 0) printf("solution is unique");
else printf("solution is not unique");
return 0;
}

BZOJ4472的更多相关文章

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

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

  2. BZOJ4472 JSOI2015salesman(树形dp)

    相当于选一个包含根的连通块使权值和最大,且每个点的儿子选取数量有限制.那么显然贪心的在所有子树中选比较大的就可以了.至于方案是否唯一只需要看选的子树是否可以替换,注意dp值为0的情况. #includ ...

  3. 【BZOJ4472】salesman(树形DP)

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

  4. bzoj4472:[Jsoi2015]salesman

    传送门 树形dp 对于每个点维护其子节点的走法是否唯一,每次取最大的并且不为负的(停留次数-1)个子儿子权值,然后判断走法是否唯一 假如有子节点的权值为0,走法也不唯一 代码: #include< ...

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

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

  6. 题解【BZOJ4472】[JSOI2015]salesman

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

  7. [bzoj4472][树形DP] Salesman

    题目 原地址 解说 刚看完这道题感觉还是挺乱的,可能那时候脑子不太清醒,一度觉得自己又要重拾Tarjan了.当然最后还是发觉应该用树形DP. (以下dp[u]代表以u为根的包括自己在内的子树的最大利润 ...

  8. JSOI BZOJ4472 salesman

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

  9. 【树形DP】JSOI BZOJ4472 salesman

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

随机推荐

  1. JS的数据类型(包含:7种数据类型的介绍、数据类型的转换、数据类型的判断)

    前言 最新的 ECMAScript 标准定义了JS的 7 种数据类型,其中包括: 6 种基本类型:Boolean.Null.Undefined.Number.String.Symbol (ECMASc ...

  2. 还是bib问题

    虽然昨天把添加bib的基本问题解决了,但是bib的参考文献没有了中括号.查了一下华东师大,只是给出了如何去掉中括号的方法. http://math.ecnu.edu.cn/~latex/doc.htm ...

  3. MyBatis数据持久化(六)resultMap使用

    resultMap是MyBatis最强大也是最重要的特性,使用它我们可以將查询结果或者sql输入条件和一个HashMap的key进行映射,大大简化了sql查询条件的输入,而且使得数据的查询变得非常灵活 ...

  4. Android ScrollView 滚动到顶部

    有时候使用ScrollView,里边控件比较多的时候,打开界面,会滑到底部,如果要设置滑动到顶部,一般有两种方法 1.使用fullScrol(),scrollView.fullScroll(Scrol ...

  5. 向 wmware workstation pro 的 MS-DOS 操作系统中导入文件(masm debug edit)(详细图解)

    一般MS-DOS中不包含masm.debug和edit这三个程序. 我们想要把这几个文件导入到wmware workstation pro中的DOS虚拟机中怎么做呢? [尝试] 1.我试过用共享文件夹 ...

  6. jQuery学习(五)——使用JQ完成复选框的全选和全不选

    1.在系统后台进行人员管理时,进行批量删除,使用jq完成全选和全不选 步骤分析: 第一步:引入jquery文件 第二步:书写页面加载函数 第三步:为上面的复选框绑定单击事件 第四步:将下面所有的复选框 ...

  7. springmvc整合mybatis实现商品列表查询

    转载.https://blog.csdn.net/chizhuyuyu/article/details/82180404 https://www.jianshu.com/p/689bdd11bfcc. ...

  8. 定时清理clientmqueue目录垃圾文件防止占满磁盘空间

    RedHat/CentOS 5.8 默认就有sendmail,而6.4默认没有.   手动清理方法: find /var/spool/clientmqueue/ -type f|xargs rm -f ...

  9. 《Unix环境高级编程》读书笔记 第3章-文件I/O

    1. 引言 Unix系统的大多数文件I/O只需用到5个函数:open.read.write.lseek以及close 本章描述的函数经常被称为不带缓冲的I/O.术语不带缓冲指的是在用户的进程中对其不会 ...

  10. Mojo C++ Bindings API

    This document is a subset of the Mojo documentation. Contents Overview Getting Started Interfaces Ba ...