poj2054(贪心)

题意:有一棵树,每个节点都有一个代价基值Ci。现在要给每个点染色,第一个染根节点,其余的节点染色的时候其父节点必须已染色。每个节点染色会用掉一个时间单位,每个节点染色的代价是染完此节点时的总时间T*Ci。问染完全部节点所需要的最小代价。


解法:这道题真的略吊,不过最终我还是看了网上的题解才会做的。每次基值最大的节点一定会是在父节点染完色后马上进行染色的,然后可以假想此节点就可以和父节点合体为一个节点。这个时候基值就变成了合体中的平均值(证明略仔细想想可以想明白)。这个算法大概就是个贪心,有点像克鲁斯卡尔求最小生成树那样,一块一块解决,最后全部归一就解决了整个问题。由于自己写的有点麻烦,wa了几发,还是太弱了,继续学习。。。


发一个对这道题解释很好的一个博客:http://www.cnblogs.com/yu-chao/archive/2012/02/19/2358565.html


我的代码:
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
struct edge
{
    int v,next;
} edges[100000];
int head[1010];
int count1=0;
void addedge(int u,int v)
{
    edges[count1].v=v;
    edges[count1].next=head[u];
    head[u]=count1&#
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值