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 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解题报告的更多相关文章
- POJ 2054 Color a Tree
贪心.... Color a Tree Time Limit: 1000MS Memory Limit: 30000K Total Submissions: ...
- poj 2054 Color a Tree(贪婪)
# include <stdio.h> # include <algorithm> # include <string.h> using namespace std ...
- POJ 2054 Color a Tree#贪心(难,好题)
题目链接 代码借鉴此博:http://www.cnblogs.com/vongang/archive/2011/08/19/2146070.html 其中关于max{c[fa]/t[fa]}贪心原则, ...
- POJ 2054 Color a Tree (贪心)
$ POJ~2054~Color~a~Tree $ $ solution: $ 我们先从题中抽取信息,因为每个点的费用和染色的次数有关,所以我们可以很自然的想到先给权值大的节点染色.但是题目还说每个节 ...
- 【LeetCode】863. All Nodes Distance K in Binary Tree 解题报告(Python)
[LeetCode]863. All Nodes Distance K in Binary Tree 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http ...
- 【LeetCode】297. Serialize and Deserialize Binary Tree 解题报告(Python)
[LeetCode]297. Serialize and Deserialize Binary Tree 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode ...
- 【LeetCode】331. Verify Preorder Serialization of a Binary Tree 解题报告(Python)
[LeetCode]331. Verify Preorder Serialization of a Binary Tree 解题报告(Python) 标签: LeetCode 题目地址:https:/ ...
- 【LeetCode】109. Convert Sorted List to Binary Search Tree 解题报告(Python)
[LeetCode]109. Convert Sorted List to Binary Search Tree 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id ...
- 【LeetCode】236. Lowest Common Ancestor of a Binary Tree 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
随机推荐
- zabbix模板的自动发现规则(ldd)实现被监控项自动发现
zabbix模板的自动发现规则(ldd)实现被监控项自动发现 自动发现规则(ldd)用途说明 在zabbix自带的linux模板的自动发现规则中,有一个Mounted filesystem disco ...
- Struts2-学习笔记系列(8)-异常处理
后台抛出自定义异常 public String execute() throws Exception { if (getUser().equalsIgnoreCase("user" ...
- Android Google Play app signing 最终完美解决方式
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/105561341 本文出自[赵彦军的博客] 在 GooglePlay 创建 App ...
- spring jar 包 用处功能:
自己积累的: @ spring-context-3.0.5.RELEASE.jar :主要用于 spring程序中加载类 ApplicationContext 用.eq: ApplicationC ...
- zathura-vim风格轻量级pdf阅读器
安装(arch/manjaro) yay -Sy zathura-pdf-poppler 0.2.9-1 使用 `快捷键` gg 行首 G 行尾 j/k/h/l 单行移动 J/K 或 Ctrl + f ...
- 程序员小张的第一篇博文 --记Markdown的使用学习
1.前言 为了即将到来的面试做准备,以及记录一下平日里自己的学习过程和生活日常,我开始进驻博客园啦!这就是我的第一篇博客(有点小激动)~ 作为一只新手,首先记录一下今晚的编写博文的学习过程吧~ 2.使 ...
- Extjs简单的form+grid组合
采用的是Extjs4.2版本 http://localhost:49999/GridPanel/Index 该链接是本地连接,只是方便自己访问,读者无法正常访问. <script src=&qu ...
- 带你五分钟了解python的函数式编程与闭包
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:梁唐 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行 ...
- L4文本预处理
文本预处理 timemachine.txt数据下载地址 链接:https://pan.baidu.com/s/1RO2OLyTRQZ90HJUW7V7BCQ 提取码:bjox NLTK数据集下载 链接 ...
- Jingwen‘s update
Bugs: The checkin button of the question answering page must be pressed twice to check in the result ...