题意:传送门
题解:引用来自:传送门
理解贪心思想,然后进行点与点之间的合并操作,答案统计时用一种增量的思想。
code:
#include<iostream>
#include<cstdio>
using namespace std;
const int N=1010;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
struct node{
int f,size,sum;
double avg;
}nodes[N];
int n,root,res;
int find()
{
double avg=0;
int res;
for(int i=1;i<=n;i++){
if(i!=root&&avg<nodes[i].avg){
avg=nodes[i].avg;
res=i;
}
}
return res;
}
int main()
{
while(233){
res=0;
n=read();root=read();
if(!n&&!root)break;
for(int i=1;i<=n;i++){
node &nd=nodes[i];
nd.avg=nd.sum=read();
res+=nd.sum;
nd.size=1;
}
for(int i=1,a,b;i<=n-1;i++){
a=read();b=read();
nodes[b].f=a;
}
for(int i=1;i<=n-1;i++){
int ver=find();
int father=nodes[ver].f;
res+=nodes[father].size*nodes[ver].sum;
nodes[ver].avg=-1;
for(int i=1;i<=n;i++){
if(nodes[i].f==ver)nodes[i].f=father;
}
nodes[father].size+=nodes[ver].size;
nodes[father].sum+=nodes[ver].sum;
nodes[father].avg=(double)nodes[father].sum/nodes[father].size;
}
printf("%d\n",res);
}
return 0;
}