码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 6060 RXD and dividing(dfs 思维)

时间:2017-09-21 13:21:44      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:keep   php   integer   big   lld   i++   -128   pre   atom   

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 Si?Sj=
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\n",ans);
    }
    return 0;
}

 

HDU 6060 RXD and dividing(dfs 思维)

标签:keep   php   integer   big   lld   i++   -128   pre   atom   

原文地址:http://www.cnblogs.com/jianrenfang/p/7567484.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!