码迷,mamicode.com
首页 > 其他好文 > 详细

【HDU1055】Color a Tree

时间:2018-09-05 23:59:52      阅读:340      评论:0      收藏:0      [点我收藏+]

标签:efi   情况   using   get   color   ios   cst   double   +=   

题意

给一棵树,要给树上每一个结点染色,第i 个结点染色需要代价为:t * w[i] (t 表示i 结点是第几个染色的),还有一个前提是:要给i 结点染色,必须先给i 结点的父结点染色(根结点随便染)

分析

lyd蓝书 p41例题

贪心,奇特的均分权值。

就分两种情况,若以该节点的父节点全部被涂过,且该节点是剩的最大权值的节点,则涂。

如果父节点没有被涂过,它一定会紧接着父节点涂了之后马上涂,所以和父节点均分节点权值(包括乘的 t 后的权值),以此类推,对于整棵树进行这样的操作,直到所有节点均分一个权值(所有节点被染色)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define N 1010
int fa[N],f[N],vis[N];
int n,r,t,x,fax;
long long ans;
struct email
{
    int sum,num;
    double w;
}a[N];
inline int find(int x)
{
    return x==fa[x]?x:fa[x]=find(fa[x]);
}
inline int getmax()
{
    int p=-1;
    double maxx=0;
    for(int i=1;i<=n;i++)
    {    
        if(!vis[i]&&maxx<a[i].w)
            maxx=a[i].w,p=i;
    }
    return p;
}

int main()
{
    while(scanf("%d%d",&n,&r)&&n)
    {
        for(int i=1;i<=n;i++)
        {
            int val;
            scanf("%d",&val);
            fa[i]=i;vis[i]=0;
            a[i].num=1;a[i].sum=val;
            a[i].w=1.0*a[i].sum/a[i].num;
        }
        for(int i=1;i<n;i++)
        {
            int u,v;
            scanf("%d%d",&u,&v);
            f[v]=u;
        }
        t=1;ans=0;vis[0]=1;f[r]=0;
        while(1)
        {
            x=getmax();
            if(x==-1)break;
            fax=find(f[x]);
            if(vis[fax])
            {
                ans+=a[x].sum*t;
                t+=a[x].num;
                vis[x]=1;
            }
            else
            {
                ans+=a[x].sum*a[fax].num;
                a[fax].num+=a[x].num;
                a[fax].sum+=a[x].sum;
                a[fax].w=1.0*a[fax].sum/a[fax].num;
                vis[x]=1;fa[x]=fax;
            }
        }
        printf("%lld\n",ans);
    }
    return 0;
}

 

【HDU1055】Color a Tree

标签:efi   情况   using   get   color   ios   cst   double   +=   

原文地址:https://www.cnblogs.com/NSD-email0820/p/9595218.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!