#include<stdio.h>
struct
{
double w;
int c,id,mark,p;
}po[1005];
int n,root;
void init()
{
for(int i=1;i<=n;i++)
{
po[i].mark=0;
po[i].id=1;
}
}
int max()
{
int i;
double max=-1;
int t;
for(i=1;i<=n;i++)
{
if(po[i].w>max&&root!=i&&po[i].mark==0)
{
max=po[i].w;
t=i;
}
}
po[t].mark=1;
return t;
}
int main()
{
int i,j;
while(scanf("%d%d",&n,&root)!=EOF)
{
int sum=0;
int maxnum;
if(n==0&&root==0)
{
break;
}
po[root].p=-1;
init();
for(i=1;i<=n;i++)
{
scanf("%d",&po[i].c);
po[i].w=po[i].c;
sum+=po[i].c;//下面循环不会加根节点,以至于每个次数少1,每个点少加一次,所以sum初始值为每个点的和
}
for(i=1;i<n;i++)
{
int a,b;
scanf("%d%d",&a,&b);
po[b].p=a;
}
for(i=1;i<n;i++)
{
maxnum=max();
sum+=po[maxnum].c*po[po[maxnum].p].id;//当前点一定在父节点后,所以乘上父节点的所有点数
po[po[maxnum].p].id+=po[maxnum].id;
po[po[maxnum].p].c+=po[maxnum].c;
po[po[maxnum].p].w=double(po[po[maxnum].p].c)/po[po[maxnum].p].id;
for(j=1;j<=n;j++)
{
if(po[j].p==maxnum)
{
po[j].p=po[maxnum].p;
}
}
}
printf("%d\n",sum);
}
}
Hdu1055 - Color a Tree - 贪心算法
最新推荐文章于 2022-04-07 17:46:05 发布