HDU_1055 POJ_2054 Color a Tree(贪心)
这道题整了一下午,最后还是看别人的解题报告弄出来的,先说说我的理解吧。大体处理思路是利用贪心思想,每次取权值最大的节点,不断的将权值最大节点与它的父节点合并。
过程:
1、初始时将序列中的time[i]都置为1,w[i]置为c[i];
2、查找最大的w[i], 返回其位置;
3、将该位置的c[]与它的父节点c[]合并(合并过程就是C_i / T_i,C_i = c[该节点] + c[父节点],T_i = time[该节点]+time[父节点])得到新的父节点w[](w[父节点] = C_i / T_i),如果有节点与pos相连,让它指向pos的父节点;
4、重复2、3,知道合并完;
至于如何求出结果:初始时使ans = sum(c[i]);每次查找到一个最大权值,ans += c[i] * time[父节点];
具体代码如下:
#include <iostream>#include <cstdio> using namespace std; const int N = 1007; struct node{int t; //time[] int p; //记录父节点 int c; //c[] double w; //w[]}num[N]; int n, r; int find() //查找最大的权值,返回其位置{int pos;double max = 0;for(int i = 1; i <= n; i++)if(num[i].w > max && i != r) //pos不能为根节点 { max = num[i].w; pos = i; }return pos;} int main(){//freopen("data.in", "r", stdin); int i, j, a, b, pos, ans, f;while(scanf("%d%d", &n, &r), n||r) { ans = 0;for(i = 1; i <= n; i++) { scanf("%d", &num[i].c); num[i].w = num[i].c; //初始时w[i]置为c[i]; num[i].t = 1; //time[i] 置为1; ans += num[i].c; //初始ans = sum(c[i]); }for(i = 1; i < n; i++) { scanf("%d%d", &a, &b); num[b].p = a; //记录父节点,建立树关系 } i = n;while(i > 1) { pos = find(); //找到最大权值的位置 num[pos].w = 0; //找到后将之置0,否则影响下次查找。 f = num[pos].p; //f为父节点 ans += num[pos].c * num[f].t; //将找到的c[pos]*time[f]加入ans for(j = 1; j <= n; j++)if(num[j].p == pos) num[j].p = f; //如果有节点与pos相连,让它指向pos的父节点 num[f].c += num[pos].c; //C_i = c[该节点] + c[父节点] num[f].t += num[pos].t; //T_i = time[该节点]+time[父节点] num[f].w = (double)num[f].c/num[f].t; //合并后的f节点的权值 i--; } printf("%d\n", ans); }return 0;}
转载于:https://www.cnblogs.com/vongang/archive/2011/08/19/2146070.html
HDU_1055 POJ_2054 Color a Tree(贪心)相关推荐
- POJ 2054 Color a Tree (贪心)
$ POJ~2054~Color~a~Tree $ $ solution: $ 我们先从题中抽取信息,因为每个点的费用和染色的次数有关,所以我们可以很自然的想到先给权值大的节点染色.但是题目还说每个节 ...
- UPC1430 Color a Tree(贪心)
链接:http://exam.upc.edu.cn/problem.php?cid=1430&pid=19 题意: 一棵树,n个节点,n-1条边,每个节点有权值val.Time为当前时间,初始 ...
- POJ 2054 Color a Tree解题报告
题干 Bob is very interested in the data structure of a tree. A tree is a directed graph in which a spe ...
- POJ 2054 Color a Tree
贪心.... Color a Tree Time Limit: 1000MS Memory Limit: 30000K Total Submissions: ...
- HDU 6241 Color a Tree
Color a Tree 题目大意:一棵树,根为1.某些点有一些限制.限制A: 该$x_i$点子树染色点至少$y_i$个. 限制B: 该$x_i$点子树外染色至少$y_i$个.求最少染色点数. 首先是 ...
- nyoj 791 Color the fence(贪心)
Color the fence 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 Tom has fallen in love with Mary. Now Tom wan ...
- PKU/POJ 2054 Color a Tree
关于树的着色. 要求从根节点出发, 遍历整棵树, 要求代价最小. 访问每个节点的代价V[i] = F[i] * C[i], C[i]为已知的值, F[i]则为访问该节点的时间. 每一步只能从已访问的节 ...
- Color a Tree
http://icpc.upc.edu.cn/problem.php?cid=1430&pid=19 结论1:对于一个非根结点,它具有非根结点的最大权值,那么访问完它的父亲后就要立即访问它才能 ...
- 《算法竞赛进阶指南》刷题记录
总算闲下来一些辣!然后最近发现其实看书是真真很有效但是一直没有落实!所以决定落实一下这段时间把这本书看完题目做完! 然后发现还有挺多题目挺巧妙的于是一堆博客预警,,,可能最近会写很多比较水(但是我还是 ...
最新文章
- 参数量下降85%,性能全面超越ViT:全新图像分类方法ViR
- CocosCreator上的游戏(调试)发布到微信小程序
- [BUUCTF-pwn]——bjdctf_2020_babyrop
- 华为p40pro怎么用鸿蒙,数码知识:华为p40pro是鸿蒙系统吗系统版本
- Android开发学习笔记:浅谈Content Provider
- mybatis学习(4):工具类和实体类的创建
- centos最小化安装后部署中文输入法
- Azure Services Bus(服务总线)中的工作流(workflow)
- 连接linux常用的工具
- MacOS:Shell工具-Royal TSX
- MediaExtractor、MediaMuxer 分离和合成 mp4
- fspecial,imfilter
- BZOJ5369-[Pkusc2018]最大前缀和
- pycharm方法中划线解决方法
- 安装新的package后出现异常错误
- 海盗湾(The Pirate Bay)的战争——每一名技术人员都应该思考的问题
- 鸿蒙系统怎么安装网易云音乐,网易云音乐鸿蒙版app下载-网易云音乐鸿蒙版最新版下载v1.7.5-IT168下载站...
- 天津理工大学2018年计算机硕士真题
- 雅思和托福的区别(转)
- 检查凭证录入模板的核算项目研发项目是否录入