某售货员小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. Redis 安装与简单示例 <第一篇>【转】

    一.Redis的安装 Redis下载地址如下:https://github.com/dmajkic/redis/downloads 解压后根据自己机器的实际情况选择32位或者64位.下载解压后图片如下 ...

  2. BZOJ 2179 FFT模板

    思路:FFT板子题 //By SiriusRen #include <cstdio> #include <complex> using namespace std; typed ...

  3. SVN Commit报错 svn: E155037: Previous operation has not finished; run 'cleanup' if it was interrupted

    svn commit 文件出错 svn: E155037: Commit failed (details follow): svn: E155037: Previous operation has n ...

  4. (转载) Android-Spinner的使用以及两种适配器

    目录视图 摘要视图 订阅 赠书 | 异步2周年,技术图书免费选      程序员8月书讯      项目管理+代码托管+文档协作,开发更流畅 Android-Spinner的使用以及两种适配器 201 ...

  5. jQuery第一课 加载页面弹出一个对话框

    <script type="text/javascript"> $(document).ready(function(){ alert("欢迎收看:" ...

  6. ip iproute2的典型应用

    net-tools和iproute2的命令做对比,做到简单明了,分别演示如何去获取.配置和操作系统网络信息. 以下是net-tools和iproute2的大致对比: 4.1 ip link set-- ...

  7. 紫书 习题 8-24 UVa 10366 (构造法)

    又是一道非常复杂的构造法-- #include<cstdio> #include<algorithm> #define REP(i, a, b) for(int i = (a) ...

  8. C语言修改文件某部分内容

    两种方法 1.全部读入内存 修改后重新存入文件 2.边读边写到另一新建文件 要修改的部分修改后存入新建文件 其他部分原封不动写入 写完删掉原先文件 将这个新的改为删掉那个的名字 方法一 读入内存修改 ...

  9. 【codeforces 370C】Mittens

    [题目链接]:http://codeforces.com/problemset/problem/370/C [题意] 给你n个人,每个人都有一双相同颜色的手套; 然允许在所有人之间交换手套; (每个人 ...

  10. ASP.NET-本地化、全球化

    在<system.web>中加入一个全球化的标识,网站就可以自适应全球化了 也可以将出错信息全球化 上面的这种方式测试过对google浏览器好像没用,但是对IE内核的是可行的,可能goog ...