• Tree Partition


    题意:

    给出一棵点权树,一个树的大小定义为所有点的权值和。问将一棵树分为 (k) 棵子树,如何分割才能使所有树的大小的最大值最小?

    传送门

    分析:

    最大值最小化问题,考虑用二分求解,枚举答案。
    问题转化为如何分割树来判断当前答案是否满足要求。如果一个子树 (v) 的权重大于 (mid),则先选择 (v) 最大的儿子 (u) 切除(即切割边 (v-u)),这样能保证剩下的部分大小尽可能地小。这样保证了图上所有的连通子图的都是小于 (mid) 的,同时也是用贪心的方法选择切割方案(每个子树都尽可能地取到最大,使剩下部分尽可能小),得到的就是最小的切割次数。

    分析:

    #include <bits/stdc++.h>
    #define pb push_back
    using namespace std;
    typedef long long ll;
    const int N=1e5+5;
    ll w[N],wt[N];
    vector<int>pic[N],ft[N];
    int num;
    bool cmp(int a,int b)
    {
        return wt[a]<wt[b];
    }
    void dfs(int v,int p,ll mid)
    {
        wt[v]=w[v];
        int cnt=0;
        ft[v].clear();
        for(int i=0;i<pic[v].size();i++)
        {
            int u=pic[v][i];
            if(u==p) continue;
            dfs(u,v,mid);
            wt[v]+=wt[u];
            ft[v].pb(u);
        }
        sort(ft[v].begin(),ft[v].end(),cmp);
        while(wt[v]>mid&&ft[v].size()>0)//优先把权重大的删除
        {
            wt[v]-=wt[ft[v][ft[v].size()-1]];
            ft[v].erase(ft[v].end()-1);
            num++;
        }
    }
    int main()
    {
        int t,n,k,u,v,cas=0;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d%d",&n,&k);
            for(int i=1;i<=n;i++)
                pic[i].clear();
            for(int i=1;i<n;i++)
            {
                scanf("%d%d",&u,&v);
                pic[u].pb(v);
                pic[v].pb(u);
            }
            ll l=0,r=1e14;
            for(int i=1;i<=n;i++)
            {
                scanf("%lld",&w[i]);
                l=max(l,w[i]);
            }
            while(l<=r)
            {
                ll mid=(l+r)>>1;
                num=0;
                dfs(1,0,mid);
                if(num+1<=k) r=mid-1;
                else l=mid+1;
            }
            printf("Case #%d: %lld
    ",++cas,l);
        }
        return 0;
    }
    
    
  • 相关阅读:
    隐马尔科夫模型
    计算复杂性理论——函数
    STM32硬件I2C调试
    FPGA简单图像处理
    STM32配置使用外部12MHz晶振
    STM32从模式接受数据
    STM32 I2C读写EEPROM(中断模式)
    STM32 I2C读写EEPROM(POLLING模式)
    STM32串口实验
    STM32使用TIM闪烁LED——PWM方式
  • 原文地址:https://www.cnblogs.com/1024-xzx/p/12949000.html
Copyright © 2020-2023  润新知