poj 2054 Color a Tree(贪婪)

# include <stdio.h>
# include <algorithm>
# include <string.h>
using namespace std;
int father[1010];
int next[1010];//当前集合的下个元素(包含i)
int pre[1010];//当前集合的上个元素(包含i)
int num[1010];//num[i]当前集合储存的点的个数(包含i)
int vis[1010];
int sum[1010];//当前集合的元素和
int c[1010];//点的花费
int n,r;
int find_max()//找到当前权值最大的集合
{
    double max=0;
	int bh=-1;
	for(int i=1;i<=n;i++)
	{
		if(max<(sum[i]*1.0)/num[i]&&!vis[i])
		{
			max=(sum[i]*1.0)/num[i];
			bh=i;
		}
	}
	return bh;
}
void uni(int x)//联合
{
	int i;
	for(i=father[x];pre[i]!=-1;i=pre[i])//找到父元素所在的集合
	{}
		sum[i]+=sum[x];
	    num[i]+=num[x];
	for(i=father[x];next[i]!=-1;i=next[i])//找到父元素所在集合的底元素
	{}
	next[i]=x;
	pre[x]=i;
	vis[x]=1;

}
int main()
{
	int i;
	while(~scanf("%d%d",&n,&r),n+r)
	{
		for(i=1;i<=n;i++)
		{
			scanf("%d",&c[i]);
			vis[i]=0;
			sum[i]=c[i];
			pre[i]=next[i]=-1;
			num[i]=1;
		}
		for(i=1;i<n;i++)
		{
			int a,b;
			scanf("%d%d",&a,&b);
			father[b]=a;
		}
		int d;
		vis[r]=1;//初始点
		while(1)
		{
			d=find_max();
			if(d==-1)
				break;
			uni(d);
		}
		int ans=0,t=1;
		for(i=r;i!=-1;i=next[i])
		{
			ans+=c[i]*t;
			t++;
		}
		printf("%d\n",ans);
	}
    return 0;
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

时间: 2024-10-26 01:42:49

poj 2054 Color a Tree(贪婪)的相关文章

poj 2054 Color a Tree 据说是贪心

Color a Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 7112   Accepted: 2438 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&qu

hdu 1055 &amp; poj 2054 Color a Tree 树&amp;贪心 找最大费用点和父节点合并

Color a Tree Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 7144 Accepted: 2458 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"

poj 2054 Color a Tree(贪心)

# include <stdio.h> # include <algorithm> # include <string.h> using namespace std; int father[1010]; int next[1010];//当前集合的下个元素(包括i) int pre[1010];//当前集合的上个元素(包括i) int num[1010];//num[i]当前集合储存的点的个数(包括i) int vis[1010]; int sum[1010];//当前

POJ 2054 Color a Tree#贪心(难,好题)

题目链接 代码借鉴此博:http://www.cnblogs.com/vongang/archive/2011/08/19/2146070.html 其中关于max{c[fa]/t[fa]}贪心原则,此博有很好的解释:http://www.cnblogs.com/rainydays/p/3271277.html 在此引用其中几段话: 试想,如果没有父节点排在节点之前的限制,那么这个题目非常简单,只需要将结点按照权值从大到小排列即可.加上了这个限制之后,如果权值最大的那个节点一旦满足了条件(父节点

poj 2054 Color a Tree

很有意思的一道贪心题,自己没想出来,理解了一下别人的思路 参考:http://www.cnblogs.com/yu-chao/archive/2012/02/19/2358565.html http://my.oschina.net/locusxt/blog/210536 题目大意:给你一颗树,树上每个节点都有自己的权值,现在要把这棵树上的所有节点染上颜色,每染一个节点需要一个单位的时间,染一个点的花费是该点的权值乘以当前时间(时间从1开始).规定在染当前点之前,必须先染他的父亲节点,求最小的花

hdu 4603 Color the Tree 2013多校1-4

这道题细节真的很多 首先可以想到a和b的最优策略一定是沿着a和b在树上的链走,走到某个点停止,然后再依次占领和这个点邻接的边 所以,解决这道题的步骤如下: 预处理阶段: step 1:取任意一个点为根节点,找出父子关系并且对这个树进行dp,求出从某个节点出发往下所包含的所有边的权值总和  复杂度O(n) step 2:从tree dp 的结果中计算对于某个节点,从某条边出发所包含的边的综合,并且对其从大到小进行排序 复杂度O(n*logn) step 3:dfs求出这颗树的欧拉回路,以及每个点的

[ACM] POJ 2154 Color (Polya计数优化,欧拉函数)

Color Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7630   Accepted: 2507 Description Beads of N colors are connected together into a circular necklace of N beads (N<=1000000000). Your job is to calculate how many different kinds of th

【POJ 3321】 Apple Tree (dfs重标号设区间+树状数组求和)

[POJ 3321] Apple Tree (dfs重标号设区间+树状数组求和) Apple Tree Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 21966   Accepted: 6654 Description There is an apple tree outside of kaka's house. Every autumn, a lot of apples will grow in the tree. K

POJ 1046 Color Me Less 最详细的解题报告

题目来源:POJ 1046 Color Me Less 题目大意:每一个颜色由R.G.B三部分组成,D=Math.sqrt(Math.pow((left.red - right.red), 2)+ Math.pow((left.green - right.green), 2)+ Math.pow((left.blue - right.blue), 2)) 表示两个不同颜色的之间的距离(以left和right为例,left和right分别为两种不同的颜色),现给出16组目标颜色,剩下的为待匹配的颜