zoukankan      html  css  js  c++  java
  • 【HDU1055】Color a Tree

    题意

    给一棵树,要给树上每一个结点染色,第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
    ",ans);
        }
        return 0;
    }
    “Make my parents proud,and impress the girl I like.”
  • 相关阅读:
    操作系统基础知识
    os库基本介绍
    原型模式
    ASP .NetCore 部署500错误 查看异常详情
    css设置文本自动换行
    SqlServer数据库链接字符串
    Json列表数据查找更新
    VB中将类标记为可序列化
    VB 性能优化点
    参加公司工作总结会要准备的内容 IT 技术部
  • 原文地址:https://www.cnblogs.com/NSD-email0820/p/9595218.html
Copyright © 2011-2022 走看看