题意:有一棵树,每个节点都有一个代价基值Ci。现在要给每个点染色,第一个染根节点,其余的节点染色的时候其父节点必须已染色。每个节点染色会用掉一个时间单位,每个节点染色的代价是染完此节点时的总时间T*Ci。问染完全部节点所需要的最小代价。
解法:这道题真的略吊,不过最终我还是看了网上的题解才会做的。每次基值最大的节点一定会是在父节点染完色后马上进行染色的,然后可以假想此节点就可以和父节点合体为一个节点。这个时候基值就变成了合体中的平均值(证明略仔细想想可以想明白)。这个算法大概就是个贪心,有点像克鲁斯卡尔求最小生成树那样,一块一块解决,最后全部归一就解决了整个问题。由于自己写的有点麻烦,wa了几发,还是太弱了,继续学习。。。
发一个对这道题解释很好的一个博客:http://www.cnblogs.com/yu-chao/archive/2012/02/19/2358565.html
我的代码:
解法:这道题真的略吊,不过最终我还是看了网上的题解才会做的。每次基值最大的节点一定会是在父节点染完色后马上进行染色的,然后可以假想此节点就可以和父节点合体为一个节点。这个时候基值就变成了合体中的平均值(证明略仔细想想可以想明白)。这个算法大概就是个贪心,有点像克鲁斯卡尔求最小生成树那样,一块一块解决,最后全部归一就解决了整个问题。由于自己写的有点麻烦,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&#