poj 2054 Color a Tree 贪心

来源:互联网 发布:网站源码加密破解 编辑:程序博客网 时间:2024/04/29 06:46
//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;} 

0 0