杭电暑期多校集训—RXD and dividing

RXD and dividing

Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)
Total Submission(s): 1353    Accepted Submission(s): 244


Problem Description
RXD has a tree T, with the size of n. Each edge has a cost.
Define f(S) as the the cost of the minimal Steiner Tree of the set S on tree T
he wants to divide 2,3,4,5,6,n into k parts S1,S2,S3,Sk,
where Si={2,3,,n} and for all different i,j , we can conclude that SiSj=
Then he calulates res=ki=1f({1}Si).
He wants to maximize the res.
1kn106
the cost of each edge[1,105]
Si might be empty.
f(S) means that you need to choose a couple of edges on the tree to make all the points in S connected, and you need to minimize the sum of the cost of these edges. f(S) is equal to the minimal cost 
 

Input
There are several test cases, please keep reading until EOF.
For each test case, the first line consists of 2 integer n,k, which means the number of the tree nodes , and k means the number of parts.
The next n1 lines consists of 2 integers, a,b,c, means a tree edge (a,b) with cost c.
It is guaranteed that the edges would form a tree.
There are 4 big test cases and 50 small test cases.
small test case means n100.
 

Output
For each test case, output an integer, which means the answer.
 

Sample Input
5 4 1 2 3 2 3 4 2 4 5 2 5 6
 

Sample Output
27
题目描述 给一棵树T,有n个结点。 给一个k,表示有k个集合,我们需要把2,3,4,…n号节点放入集合,要保证k个集合的并集等于{2,3,4,5n},并且集合互不相交。
(集合可以为空)然后每次取一个集合Si与{1}求并,得到比如{1,2,3},那么tempi = f({1,2,3});f({1}并Si)的意思是把
合内的所有点连接起来的边的权值和。最后把所有权值和相加的到答案。
解题思路 我们要想得到最大的答案,那么就要尽可能的去利用这些边,也就是尽可能重复计算这些边。 那么我们想,假设先从叶子节点开始,把这些叶子节点放入一个集合,那么这个集合的temp值就会把所有的边都算一遍。
那么下次我们取所有叶子节点的父亲,放入一个集合,那么这个集合的temp值会把除了叶子节点到父亲的那条那边的其他所有边都算一遍
。因为集合可以为空,以此类推,我们就可以得到最大的答案。但是如果遇到集合不够的情况,就把剩下的所有点加入最后一个集合。 那么有以上分析,其实就是算每条边会算多少次,比如叶子节点到父亲的那条边会算一次。
其实一条边会算多少次跟某个点的所有子孙节点个数有关,就比如样例中,2号点有3个子孙节点, 那么2号点连接父节点的那条边会算3+1次。3号点有0个子孙节点,那么3号点连接父节点的那条边会算0+1次。 那么其实问题就是转化为求每个点的子孙节点个数,然后算出每条边要重复计算的次数即可。  
#include<bits/stdc++.h>  
using namespace std;  
  
struct Edge{  
    int v,w;  
};  
  
Edge temp;  
vector<Edge> vec[1000005];  
int Size[1000005];  ///保存每个节点的子节点的个数
int w[1000005];  ///存权重
  
void dfs(int u,int pre){  ///递归找到每一个节点的子节点的个数
    Size[u]=1;  
    int len=vec[u].size();  
    for(int i=0;i<len;i++){  
        int v=vec[u][i].v;  
        if(v!=pre){  
            w[v]=vec[u][i].w;  
            dfs(v,u);  
            Size[u]+=Size[v];  
        }  
    }  
}  
  
int main(){  
    int n,k;  
    while(~scanf("%d%d",&n,&k)){  
        for(int i=1;i<=n;i++){  
            vec[i].clear();  
            Size[i]=0;  
            w[i]=0;  
        }  
        for(int i=1;i<=n-1;i++){  
            int u,v,w;  
            scanf("%d%d%d",&u,&v,&w);  
            temp.v=v;  
            temp.w=w;  
            vec[u].push_back(temp);  
            temp.v=u;  
            vec[v].push_back(temp);  
        }  
        dfs(1,-1);  
        long long sum=0;  
        for(int i=2;i<=n;i++){  
            sum+=(long long)w[i]*min(Size[i],k);  ///k个集合,字节个数要和k比较取小的
        }  
        printf("%lld\n",sum);  
    }  
    return 0;  
}   


 
资源下载链接为: https://pan.quark.cn/s/1bfadf00ae14 “STC单片机电压测量”是一个以STC系列单片机为基础的电压检测应用案例,它涵盖了硬件电路设计、软件编程以及数据处理等核心知识点。STC单片机凭借其低功耗、高性价比和丰富的I/O接口,在电子工程领域得到了广泛应用。 STC是Specialized Technology Corporation的缩写,该公司的单片机基于8051内核,具备内部振荡器、高速运算能力、ISP(在系统编程)和IAP(在应用编程)功能,非常适合用于各种嵌入式控制系统。 在源代码方面,“浅雪”风格的代码通常简洁易懂,非常适合初学者学习。其中,“main.c”文件是程序的入口,包含了电压测量的核心逻辑;“STARTUP.A51”是启动代码,负责初始化单片机的硬件环境;“电压测量_uvopt.bak”和“电压测量_uvproj.bak”可能是Keil编译器的配置文件备份,用于设置编译选项和项目配置。 对于3S锂电池电压测量,3S锂电池由三节锂离子电池串联而成,标称电压为11.1V。测量时需要考虑电池的串联特性,通过分压电路将高电压转换为单片机可接受的范围,并实时监控,防止过充或过放,以确保电池的安全和寿命。 在电压测量电路设计中,“电压测量.lnp”文件可能包含电路布局信息,而“.hex”文件是编译后的机器码,用于烧录到单片机中。电路中通常会使用ADC(模拟数字转换器)将模拟电压信号转换为数字信号供单片机处理。 在软件编程方面,“StringData.h”文件可能包含程序中使用的字符串常量和数据结构定义。处理电压数据时,可能涉及浮点数运算,需要了解STC单片机对浮点数的支持情况,以及如何高效地存储和显示电压值。 用户界面方面,“电压测量.uvgui.kidd”可能是用户界面的配置文件,用于显示测量结果。在嵌入式系统中,用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值