POJ 2054

来源:互联网 发布:get it与got it口语 编辑:程序博客网 时间:2024/05/22 20:43

Color a Tree

Time Limit: 1000MS Memory Limit: 30000K
Total Submissions: 7895 Accepted: 2707
Description

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
Source

Beijing 2004
个人理解:
贪心一般怎么判断最优?交换并加以证明。此时考虑只有两个叶子结点,最大的先染就好。现在考虑样例,假设先染左边那么有a[i]1+a[i+2]*2+a[i+1]*3+a[i+3]*4,如果交换次序呢,这也是找寻贪心原则的基本方式,假设条件最优。有a[i+1]*1+a[i+3]*2+a[i]*3+a[i+2]*4,假设后者比前者优,那么有2(a[i]+a[i+2])>2(a[i+1]+a[i+3])。以上作为引子。现在考虑一般情况。
设now[i],为被合并的费用平均值。cnt[i]为结点i合并的结点数。(k,x)即为一个边,x染色后,节点x被染色后,节点x被并入k。now[k]=(now[k]*cnt[k]+now[x]*cnt[x])/(cnt[x]+cnt[k])。合并n-1次,每次选择now最大的。
从上面的特殊情况为什么能推出选择Now最大的这个贪心最优策略呢?分治的思想,叶子结点就是上面的特殊情况,那么考虑一个子树和另一个子树呢,其实不妨证以下,给样例多加一个高度,就可以得到上面为什么那么判定了。把他看成集合,顺序在其集合内部是怎么样分配的不用考虑只用考虑平均数的大小关系。
c++

原创粉丝点击