2017 Multi-University Training Contest - Team 3 hdu6060 RXD and dividing

地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6060

题目:

RXD and dividing

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


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
 思路:
  智商感觉被碾压。题解是从整体考虑的,而我一直从局部考虑,试图求出各个集合。。。走远了
  
 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 #define MP make_pair
 6 #define PB push_back
 7 typedef long long LL;
 8 typedef pair<int,int> PII;
 9 const double eps=1e-8;
10 const double pi=acos(-1.0);
11 const int K=1e6+7;
12 const int mod=1e9+7;
13 
14 vector<PII>mp[K];
15 int n,k,sz[K];
16 LL ans;
17 void dfs(int u,int f)
18 {
19     sz[u]=1;
20     for(auto v:mp[u])if(f!=v.first) dfs(v.first,u),sz[u]+=sz[v.first];
21     for(auto v:mp[u])if(f!=v.first) ans+=1LL*v.second*min(sz[v.first],k);
22 }
23 int main(void)
24 {
25 
26     while(~scanf("%d%d",&n,&k))
27     {
28         ans=0;
29         memset(mp,0,sizeof mp);
30         for(int i=1,x,y,z;i<n;i++)
31             scanf("%d%d%d",&x,&y,&z),mp[x].PB(MP(y,z)),mp[y].PB(MP(x,z));
32         dfs(1,0);
33         printf("%lld\n",ans);
34     }
35     return 0;
36 }

 

posted @ 2017-08-01 21:55  weeping  阅读(137)  评论(0编辑  收藏  举报