题干
Bob is very interested in the data structure of a tree. A tree is a directed graph in which a special node is singled out, called the “root” of the tree, and there is a unique path from the root to each of the other nodes.
Bob intends to color all the nodes of a tree with a pen. A tree has N nodes, these nodes are numbered 1, 2, …, N. Suppose coloring a node takes 1 unit of time, and after finishing coloring one node, he is allowed to color another. Additionally, he is allowed to color a node only when its father node has been colored. Obviously, Bob is only allowed to color the root in the first try.
Each node has a “coloring cost factor”, Ci. The coloring cost of each node depends both on Ci and the time at which Bob finishes the coloring of this node. At the beginning, the time is set to 0. If the finishing time of coloring node i is Fi, then the coloring cost of node i is Ci * Fi.
For example, a tree with five nodes is shown in Figure-1. The coloring cost factors of each node are 1, 2, 1, 2 and 4. Bob can color the tree in the order 1, 3, 5, 2, 4, with the minimum total coloring cost of 33.
Given a tree and the coloring cost factor of each node, please help Bob to find the minimum possible total coloring cost for coloring all the nodes.
Input
The input consists of several test cases. The first line of each case contains two integers N and R (1 <= N <= 1000, 1 <= R <= N), where N is the number of nodes in the tree and R is the node number of the root node. The second line contains N integers, the i-th of which is Ci (1 <= Ci <= 500), the coloring cost factor of node i. Each of the next N-1 lines contains two space-separated node numbers V1 and V2, which are the endpoints of an edge in the tree, denoting that V1 is the father node of V2. No edge will be listed twice, and all edges will be listed.

A test case of N = 0 and R = 0 indicates the end of input, and should not be processed.
Output
For each test case, output a line containing the minimum total coloring cost required for Bob to color all the nodes.
Sample Input
5 1
1 2 1 2 4
1 2
1 3
2 4
3 5
0 0
Sample Output
33

题意,每个结点都有一个粉刷权值,第几个访问所消耗的代价就是权值乘以第几次访问!贪心,怎么贪?经历了觉得网站有问题以及换网站。


去CSDN去看了看大牛写的博客,解题报告,不太明白。慢慢的摸索,抄代码,修改,自己敲。比较 权值应该等于真实权值➗合并节点数,相当于这个节点由N个等权值结点组成。权值就是刷它之前所消耗的代价,这样理解起来就不是很难。
这样一来就是不断从大到小归并权值,直到root树根。
便有了如下贪心准则:
1.要使代价小,必须尽早访问权值较大的结点。
2.要访问该结点,必须先访问他的父节点。
3.访问一个节结后,从该节点的父结点访问该节点的子节点不需要 是消耗代价。
也就是说访问了最大值的父节点就因该立刻访问最大直结点。便可以找最大值节点开始访问。
代码如下

#include<iostream>
#include<queue>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<map>
#include<cstring>
using namespace std;
bool myfind();
struct object
{int grade,fa,tim;double weight;
}ob[1005];
int branch,root,flag,fa,kid,tem,mx=0;
int main()
{ios::sync_with_stdio(false);while(cin>>branch>>root){tem=0;memset(ob,0,sizeof(object)*1005);if(branch==root&&branch==0) break;for(int i=1;i<=branch;i++) cin>>ob[i].grade,ob[i].tim=1,ob[i].weight=ob[i].grade;for(int i=1;i<branch;i++){cin>>fa>>kid;ob[kid].fa=fa;}while(myfind()){ob[ob[mx].fa].grade=ob[ob[mx].fa].grade+ob[mx].grade;tem=tem+ob[ob[mx].fa].tim*ob[mx].grade;ob[ob[mx].fa].tim=ob[ob[mx].fa].tim+ob[mx].tim;//cout<<tem<<endl;ob[mx].weight=0;for(int i=1;i<=branch;i++){if(ob[i].fa==mx) ob[i].fa=ob[mx].fa;}ob[ob[mx].fa].weight = 1.0*ob[ob[mx].fa].grade/ob[ob[mx].fa].tim ;}tem=tem+ob[root].grade;cout<<tem+1<<endl;}return 0;
}
bool myfind()
{double max=0;flag=0;for(int i=1;i<=branch;i++){if(i==root) continue;if(ob[i].weight>max){max=ob[i].weight;mx=i;flag=1;//cout<<i<<endl;}}return flag;
}

POJ 2054 Color a Tree解题报告相关推荐

  1. POJ 2054 Color a Tree (贪心)

    $ POJ~2054~Color~a~Tree $ $ solution: $ 我们先从题中抽取信息,因为每个点的费用和染色的次数有关,所以我们可以很自然的想到先给权值大的节点染色.但是题目还说每个节 ...

  2. POJ 2054 Color a Tree

    贪心....                    Color a Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions:  ...

  3. PKU/POJ 2054 Color a Tree

    关于树的着色. 要求从根节点出发, 遍历整棵树, 要求代价最小. 访问每个节点的代价V[i] = F[i] * C[i], C[i]为已知的值, F[i]则为访问该节点的时间. 每一步只能从已访问的节 ...

  4. 【LeetCode】863. All Nodes Distance K in Binary Tree 解题报告(Python)

    [LeetCode]863. All Nodes Distance K in Binary Tree 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http ...

  5. LeetCode 1104. Path In Zigzag Labelled Binary Tree解题报告

    1104. Path In Zigzag Labelled Binary Tree Path In Zigzag Labelled Binary Tree python solution 题目描述 I ...

  6. 【LeetCode】538. Convert BST to Greater Tree 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 日期 题目地址:https://leetcod ...

  7. 655. Print Binary Tree 解题报告(树)

    第一部分:搜索.遍历 [例子1]655. Print Binary Tree Example 1: Input:1/2 Output: [["", "1", & ...

  8. 【原创】leetCodeOj ---Convert Sorted List to Binary Search Tree 解题报告

    原题地址: https://oj.leetcode.com/problems/convert-sorted-list-to-binary-search-tree/ 题目内容: Given a sing ...

  9. LeetCode: Convert Sorted Array to Binary Search Tree 解题报告

    Convert Sorted Array to Binary Search Tree Given an array where elements are sorted in ascending ord ...

最新文章

  1. Go 分布式学习利器(9)-- Go语言 结构体的行为定义和实现
  2. 【AI】caffe使用步骤(三):编写求解文件solver.prototxt
  3. C++将带ui界面的qt工程封装为动态库dll
  4. tty_operations
  5. QCon演讲|闲鱼从零到千万DAU的应用架构演进
  6. oracle 性能优化 常用,Oracle數據庫常用性能優化
  7. Android 系统(83)---屏幕尺寸
  8. 淘宝面试-Strcpy与memcpy两函数的经典实现
  9. MySQL按照汉字拼音首字母排序
  10. maven的一些依赖
  11. 计算机主机技术标准规范,数据中心机房建设,需要依据哪些国家标准和行业标准或规范?...
  12. 功能测试Ⅷ——业务流程测试
  13. 莱斯康混响插件合集 – Lexicon PCM LXP MPX Native Reverb WiN
  14. 数学基础类:如何求矩阵的特征值和特征向量
  15. 傻子都能看懂的 财务报表入门
  16. 【mysql 练习题】查询和“01”号同学所学课程完全相同的其他同学的学号
  17. 论坛社区小程序(前段+后端)安装教程
  18. Mysql中使用count加条件统计
  19. [Crypto]ECB模式攻击
  20. 基于c语言防盗系统,基于STC89C51的无线智能防盗报警系统.doc

热门文章

  1. 手机ppt怎么添加页码_全网超详细的操作教程,手把手教你使用高效PPT小技巧!...
  2. mysql dba管理_Mysql DBA 高级运维学习之路-mysql数据库常用管理应用
  3. 10- vue django restful framework 打造生鲜超市 -用户登录和手机注册(中)
  4. 【安全牛学习笔记】漏洞扫描
  5. 如何在centos安装python3.4
  6. JavaScript 进阶(二)变量作用域
  7. UIView使用UIMotionEffect效果
  8. 要鼓励周鸿祎做360搜索
  9. 一起谈.NET技术,C#序列化与反序列化(Serializable and Deserialize)
  10. sql 查询性能的问题 有order by 和无order by 速度竟然相差百倍