zoukankan      html  css  js  c++  java
  • HDU 6060 RXD and dividing(dfs 思维)

    RXD and dividing

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


    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
    Source
    【题意】给你一棵树,将节点[2,n]最多分为k份,再将1节点加入到每一份,将每一份的节点连接起来,权值之和加入ans,求最大化ans。
    【分析】咋一看,发现很难,不会...但看了题解后仔细一想,就是个傻逼题啊...每一个 节点与他父亲节点之间的权值的贡献就是他子树分成的份数,那我们就最大化这个份   数就是了...
      
    #include <bits/stdc++.h>
    #define inf 0x3f3f3f3f
    #define met(a,b) memset(a,b,sizeof a)
    #define pb push_back
    #define mp make_pair
    #define rep(i,l,r) for(int i=(l);i<=(r);++i)
    #define inf 0x3f3f3f3f
    using namespace std;
    typedef long long ll;
    const int N = 1e6+50;;
    const int M = 255;
    const int mod = 19260817;
    const int mo=123;
    const double pi= acos(-1.0);
    typedef pair<int,int>pii;
    int n,k,cas;
    ll ans;
    int sz[N];
    vector<pii>edg[N];
    void dfs(int u,int fa){
        sz[u]=1;
        for(auto e : edg[u]){
            int v=e.first;
            int w=e.second;
            if(v==fa)continue;
            dfs(v,u);
            sz[u]+=sz[v];
            ans+=1LL*w*min(sz[v],k);
        }
    }
    int main(){
        //int T;
        //scanf("%d",&T);
        while(~scanf("%d%d",&n,&k)){
            for(int i=1;i<=n;i++)edg[i].clear();
            for(int i=1,u,v,w;i<n;i++){
                scanf("%d%d%d",&u,&v,&w);
                edg[u].pb(mp(v,w));edg[v].pb(mp(u,w));
            }
            ans=0;
            dfs(1,0);
            printf("%lld
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    bzoj 4066: 简单题 K-D树
    SAS获取最后一条观测到指定宏
    sas 获取字符串长度实例
    tomcat Error:NB:JAVA_HOME should point to a JDK not a JRE 解决方法
    ODBC数据源管理器-》系统DSN-》没有....Microsoft Access Driver(*mdb,*,accdb)
    SAS DATA ENCODING 解决odbc乱码问题
    sas 日期比较代码备忘
    sas transpose 代码备忘
    svn 红叉叉图标解决方法
    echart line 初始化隐藏legend
  • 原文地址:https://www.cnblogs.com/jianrenfang/p/7567484.html
Copyright © 2011-2022 走看看