//poj 2054
//sep9
#include <iostream>
using namespace std;
const int MAXN=1024;
int n,root,e_cnt;
int vis[MAXN],num[MAXN],c[MAXN],prev[MAXN];
int head[MAXN],adj[MAXN],next[MAXN];
int find_root()
{
double maxx=0;
int tmp_root;
for(int i=1;i<=n;++i){
if(!vis[i]&&(double)c[i]/num[i]>maxx&&i!=root){
maxx=(double)c[i]/num[i];
tmp_root=i;
}
}
return tmp_root;
}
void merge(int k,int p)
{
num[p]+=num[k];
c[p]+=c[k];
for(int i=head[k];i;i=next[i])
prev[adj[i]]=p;
}
int solve()
{
int ans=0;
for(int i=1;i<n;++i){
int k=find_root();
vis[k]=1;
int p=prev[k];
while(vis[p]) p=prev[p];
ans+=num[p]*c[k];
merge(k,p);
}
return ans+c[root];//最后只剩一个点了,他的cost就是ans+c[root]。
}
int main()
{
while(scanf("%d%d",&n,&root)==2&&n+root){
memset(head,0,sizeof(head));
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;++i){
scanf("%d",&c[i]);
num[i]=1;
}
e_cnt=1;
for(int i=1;i<n;++i){
int u,v;
scanf("%d%d",&u,&v);
prev[v]=u;
adj[e_cnt]=v,next[e_cnt]=head[u],head[u]=e_cnt++;
}
printf("%d\n",solve());
}
return 0;
}
poj 2054 Color a Tree 贪心
最新推荐文章于 2023-08-23 01:11:09 发布