Color a Tree POJ - 2054(贪心+点的合并+增量)

本文探讨了使用贪心算法解决特定问题的方法,通过点与点之间的合并操作,利用增量思想统计答案。代码示例展示了如何在C++中实现这一算法,包括读取输入、寻找最优合并点和更新节点状态的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:传送门
题解:引用来自:传送门
理解贪心思想,然后进行点与点之间的合并操作,答案统计时用一种增量的思想。
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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值