贪心。。。。

                   Color a Tree
Time Limit: 1000MS   Memory Limit: 30000K
Total Submissions: 6647   Accepted: 2249

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

贪心原则应该是Ci大的尽量先染色,但是由于父节点染了才能染子节点的限制使得问题不好解决了,但是Ci大的一定是在其父节点染色后立即被染色,这时大牛们的思路我也没有看明白如何证明的,但仔细一想就明白了。于是我们根据这个条件就可以将Ci大的点与其父节点合并在一起组成一个集合。这样就可以将问题规模减小。

合并后的点(即集合)的属性如何变化呢?假如设fact[i]表示集合的Ci和,iNum[i]表示i所属集合的结点个数;那么把fact[i]/iNum[i]作为贪心原则,其值大者先合并到其父节点,最终合并成一个集合。

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4
 5 using namespace std;
 6
 7 struct Edge
 8 {
 9     int to,next;
10 }e[1111];
11
12 int n,root,Size,Adj[1111],c[1111],num[1111],father[1111];
13 bool vis[1111];
14
15 void Init()
16 {
17     Size=0;
18     memset(Adj,-1,sizeof(Adj));
19     memset(vis,false,sizeof(vis));
20 }
21
22 void Add_Edge(int u,int v)
23 {
24     ///u-->v
25     e[Size].to=v;
26     e[Size].next=Adj[u];
27     Adj[u]=Size++;
28 }
29
30 int Find()
31 {
32     int k=-1;
33     double maxn=-0x3f3f3f3f;
34     for(int i=1;i<=n;i++)
35     {
36         if(!vis[i]&&i!=root&&maxn<(double)c[i]/num[i])
37         {
38             maxn=(double)c[i]/num[i];
39             k=i;
40         }
41     }
42     return k;
43 }
44
45 void Union(int a,int b)
46 {
47     /// a to b
48     num[b]+=num[a];
49     c[b]+=c[a];
50     father[a]=b;
51     for(int i=Adj[a];~i;i=e[i].next)
52     {
53         int v=e[i].to;
54         father[v]=b;
55     }
56 }
57
58 int solve()
59 {
60     int ans=0;
61     for(int i=0;i<n-1;i++)
62     {
63         int k=Find();
64         vis[k]=true;
65         int p=father[k];
66         while(vis[p]) p=father[p];
67         ans+=c[k]*num[p];
68         Union(k,p);
69     }
70     ans+=c[root];
71     return ans;
72 }
73
74 int main()
75 {
76     while(scanf("%d%d",&n,&root)!=EOF)
77     {
78         if(n==0&&root==0) break;
79         Init();
80         for(int i=1;i<=n;i++)
81         {
82             scanf("%d",c+i);
83             num[i]=1;
84         }
85         for(int i=0;i<n-1;i++)
86         {
87             int u,v;
88             scanf("%d%d",&u,&v);
89             Add_Edge(u,v);
90             father[v]=u;
91         }
92         printf("%d\n",solve());
93     }
94     return 0;
95 }

转载于:https://www.cnblogs.com/CKboss/p/3361809.html

POJ 2054 Color a Tree相关推荐

  1. POJ 2054 Color a Tree (贪心)

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

  2. 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 ...

  3. PKU/POJ 2054 Color a Tree

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

  4. HDU 6241 Color a Tree

    Color a Tree 题目大意:一棵树,根为1.某些点有一些限制.限制A: 该$x_i$点子树染色点至少$y_i$个. 限制B: 该$x_i$点子树外染色至少$y_i$个.求最少染色点数. 首先是 ...

  5. poj 3013 Big Christmas Tree(最短路变形)

    传送门:POJ 3013 Big Christmas Tree 描述: Big Christmas Tree Time Limit: 3000MS   Memory Limit: 131072K To ...

  6. poj 2777Count Color

    这道题,做的太悲催了,开始想到每个节点的涂色情况用数组来存,1代表有,0代表没有,提交上去果断RE了好几次,原因是here A, B, C are integers, and A may be lar ...

  7. 【POJ - 2486】Apple Tree (树形背包,dp)

    题干: Wshxzt is a lovely girl. She likes apple very much. One day HX takes her to an apple tree. There ...

  8. 【POJ - 3321】 Apple Tree(dfs序 + 线段树维护 或 dfs序 + 树状数组维护)

    题干: There is an apple tree outside of kaka's house. Every autumn, a lot of apples will grow in the t ...

  9. POJ 1046 Color Me Less(浅水)

    一.Description A color reduction is a mapping from a set of discrete colors to a smaller one. The sol ...

最新文章

  1. 这样建统一告警平台,运维的告警麻痹症有救了
  2. AI时代,产品经理需要掌握的5项新技能
  3. Warning: post-commit hook failed (exit code 255) with no output.
  4. 001_Layout布局
  5. android 截屏指定区域,Android截图 截取ContentView 截取指定的View并且保存
  6. 动态代理:JDK动态代理和CGLIB代理的区别
  7. mysql数据库文件的真实的物理存储位置
  8. CTF -杂项密码学,常见密码介绍(二)
  9. Java应用全链路启动速度提升至15s,阿里云SAE能力再升级
  10. Linux 常用测试命令
  11. C#中ref和out的使用小结
  12. 基于JAVA+Servlet+JSP+MYSQL的失物招领系统
  13. 7.1.21 jQuery 的 Post请求
  14. 计算机桌面调音量的图标不见了,声音图标不见了,音量图标不见了怎么办?
  15. 算法工程师分类与要求
  16. 一个电脑可以装两个java么,是否可以在一台计算机上安装多个Eclipse?
  17. 股票量化交易有什么优势?注意哪些风险?
  18. 世界上各种壮观震撼奇景。也许你这辈子都看不到了!
  19. 关联规则 置信度定义
  20. linux内存懒分配,Linux 性能分析总结之内存缓存与Swap(四)

热门文章

  1. php代码丑,php – 屏幕截图你生命中见过的最丑陋的HTML
  2. yii2 html 跳转,阐述在Yii2上实现跳转提示页
  3. 《零基础》MySQL 删除数据库(六)
  4. java客户端连接请求发不出去_java – Spring:客户端发送的请求在语法上不正确()...
  5. java io编程_Java_IO编程
  6. 如何设置MySQL的环境变量
  7. 从java代码获取类名_java代码获取当前类类名、方法名
  8. 小米手环导出心率_这个功能有意思,小米11支持指纹检测心率,没有手环也不怕...
  9. MySQL 修改和删除索引
  10. python堆模块_python内置堆模块