题目链接 Game

题目的意思很简单, 就是要找一棵树权值最大等等前K条链。

在本题中,走的次数等于min(叶子结点个数,k)

tree[i].sum意为从i号结点出发走到某个叶子结点能得到的最大总价值。

pson[i]表示i号结点若要获得最大价值那么下一步该怎么走。

显然tree[i].sum和pson[i]是从i的各个儿子转移得到的。

那么先做一遍DFS计算出tree[i].sum, 再排序。

然后贪心,从价值最大的那个结点开始选,从大到小。

选的时候,要把他中途经过的结点全部屏蔽(就是说被屏蔽的结点接下来不能被选了)。

当选的次数到达k或者没有结点可选时那就停止。

具体可以看我的代码。

 #include <bits/stdc++.h>

 using namespace std;

 #define REP(i,n)                for(int i(0); i <  (n); ++i)
#define rep(i,a,b) for(int i(a); i <= (b); ++i)
#define dec(i,a,b) for(int i(a); i >= (b); --i)
#define for_edge(i,x) for(int i = H[x]; i; i = X[i]) #define LL long long const int N = + ;
const int M = + ;
const int A = + ; struct Node{
LL sum; int id;
friend bool operator < (const Node &a, Node &b){
return a.sum > b.sum;
}
} tree[N]; int E[N << ], X[N << ], H[N << ], pson[N];
bool isleaf[N], v[N], vc[N];
LL a[N], c[N], ans;
int T, n, k, et, x, y, num;
int Case = ;
int cnt = ; bool cmp(LL a, LL b){ return a > b;} inline void addedge(int a, int b){
E[++et] = b, X[et] = H[a], H[a] = et;
} void dfs(int x, int fa){
LL cnt = , tot = , w = ;
tree[x].sum = a[x];
for_edge(i, x) if (E[i] != fa){
int u = E[i]; ++cnt;
dfs(u, x);
if (tree[u].sum > tot){ tot = tree[u].sum; w = u;}
}
pson[x] = w;
if (cnt == ) isleaf[x] = true;
else tree[x].sum += tree[w].sum;
} void tag(int x){
v[x] = false;
if (!isleaf[x]) tag(pson[x]);
} int main(){ scanf("%d", &T);
while (T--){
et = ; num = ;
scanf("%d%d", &n, &k);
memset(H, , sizeof H);
memset(c, , sizeof c);
memset(pson, , sizeof pson);
memset(vc, false, sizeof vc);
memset(isleaf, false, sizeof isleaf);
rep(i, , n) scanf("%lld", a + i);
rep(i, , n - ){
scanf("%d%d", &x, &y);
addedge(x, y); addedge(y, x);
vc[y] = true;
}
rep(i, , n) tree[i].id = i;
dfs(, );
sort(tree + , tree + n + );
memset(v, true, sizeof v);
cnt = ; ans = ;
rep(i, , n) if (v[tree[i].id] && cnt < k){
ans += tree[i].sum;
tag(tree[i].id);
++cnt;
} printf("Case #%d: %lld\n", ++Case, ans); } return ; }

HDU 5242 Game(树上贪心)的更多相关文章

  1. HDU 5242 Game(贪心)

    http://acm.hdu.edu.cn/showproblem.php?pid=5242 题意: 给出一棵树,每个节点都有一个权值,每次可以获得从根结点(1)到叶子节点上的所有权值和,每个节点只能 ...

  2. HDU 4442 Physical Examination(贪心)

    HDU 4442 Physical Examination(贪心) 题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=4442 Descripti ...

  3. G - Game HDU - 5242 (数链剖分)

    题目链接: G - Game HDU - 5242 题目大意:首先是T组测试样例,给出一颗以1节点为根的树,每个节点有各自的价值,有m次从根节点出发向下走到叶子节点的机会,每次会得到所有经过节点的权值 ...

  4. 2067: [Poi2004]SZN——树上贪心+二分

    题目大意: 给一棵树.求用最少的链覆盖这棵树(链不能相交),在这个基础上求最长的链最短可以是多少. n<=10000 题解: 肯定先处理第一问: 答案:$\sum_(du[i]-1)/2+1$ ...

  5. hdu 5242——Game——————【树链剖分思想】

    Game Time Limit:1500MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status  ...

  6. bzoj 2525: [Poi2011]Dynamite【二分+树上贪心】

    一眼二分.然后重点是树上贪心部分 长得像dp一样,设mn为子树内已炸点的最浅点,mx为子树内没有炸并且需要炸的最深点,然后转移直接从子树继承即可 然后是判断当前u点是否需要炸,当mx[u]+mn[u] ...

  7. HDU 5242 Game(三个贪心)

    Game Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  8. HDU 5242 利用树链剖分思想进行贪心

    题目大意: 在给定带权值节点的树上从1开始不回头走到某个底端点后得到所有经过的点的权值后,这些点权值修改为0,到达底部后重新回到1,继续走,问走k次,最多能得到多少权值之和 这其实就是相当于每一次都走 ...

  9. HDU - 6178:Monkeys (贪心&树上最大匹配输&输入优化)

    There is a tree having N vertices. In the tree there are K monkeys (K <= N). A vertex can be occu ...

随机推荐

  1. String使用方法详解

    标准c++中string类函数介绍 注意不是CString 之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够.字符串长度等等,而且作 ...

  2. 51nod_1154 回文串的划分

    说实话..最开始看这题感觉一定好难...好高大上...我的马拉车还不熟....这种..但是本着做不出来也要至少看看的心态,吧个题看完了..然后简单的想了想,好像是个挺直观的动态规划,因为看到数据几乎就 ...

  3. IOS开发---菜鸟学习之路--(七)-自定义UITableViewCell

    本篇将介绍如何自定义 UITableViewCell 首先选择新建文件 可以直接使用快捷键 COMMAND+n打开新建页面,然后选Objective-C class 然后选择继承之UITableVie ...

  4. Codeforces 1062E 题解

    给出一棵有根树,1为根结点,接下来q次询问,每次给出一个[l,r]区间,现在允许删掉[l,r]区间内任何一个点,使得所有点的最近公共祖先的深度尽可能大,问删掉的点是哪个点,深度最大是多少. 做法: 线 ...

  5. Hibernate命名策略及配置

    hibernate 表 命名策略         分类:            hibernate2013-02-27 18:46464人阅读评论(0)收藏举报 Hibernate注释下的自定义架构实 ...

  6. MFC编程入门之二十八(常用控件:列表视图控件List Control上)

    前面一节中,讲了图片控件Picture Control,本节为大家详解列表视图控件List Control的使用. 列表视图控件简介 列表视图控件List Control同样比较常见,它能够把任何字符 ...

  7. caffe-dnnh实验

    下面是我在做基于深度哈希的大规模图像检索中的一个实验,相关文档介绍给大家,具体内容查看提供的相关链接,总结的很到位了,我就不再赘述. 实践cvpr2015年的深度哈希图像检索论文:Simultaneo ...

  8. Unity3D - 设计模式 - 工厂模式

    工厂模式:以食物生产为例 1. 一个生产食物的工厂(此项 需要建立两个类:食物基类<Food>,工厂类<Factory>) 2. 可以生产不同的食物(此项 建立食物的具体子类, ...

  9. xml读取 避开并发(xml的一些操作)

    很多地方读取文件可能会出现并发现象 处理: 使用FileMode.Open, FileAccess.Read, FileShare.ReadWrite 避开并发 public static List& ...

  10. http长短连接和长短轮询

    http长连接 http长连接是指http的请求头和响应头的均有connection: keep-alive的请求,也就是客户端和服务端均为keep-alive的请求. 实际上,http是请求/响应式 ...