hdu 6060 RXD and dividing(dfs)

原创 2017年08月04日 10:05:59

RXD and dividing
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others)
Total Submission(s): 65 Accepted Submission(s): 15
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.
1≤k≤n≤106
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 n−1 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 n≤100.

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

题意:
将一棵树里面的点分成k个集合,并在集合里加入一些边使的一个集合里的任意两个点连通,求使得所有加入集合的边的和的最大值

解析:
要是边的和最大,所以要尽可能多地使用这些边。
所以一颗子树里的孩子节点都要尽可能分到不同的集合里。如果k足够大,那么每一棵子树的孩子节点(包括孙子节点)+子树根节点都可以分到不同的集合,那么这棵子树的根节点向上连接的边(就是该节点与其父节点连接的边)被计算了(child+1)次。但k不足够大即(child+1>k),那么子树的孩子节点最多只能被分到k个集合里,所以根节点向上连接的边只被计算了k次,因此边 的计算次数就是min(child+1,k)

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#define MAXN 1000010
#define INF 1999999999
using namespace std;
typedef long long ll;

typedef struct node
{
    ll next;
    ll val;
}node;

ll n,k;
vector<node> edge[MAXN];
ll ans;

ll dfs(ll a,ll valu)  //用dfs来算一颗树的所有孩子节点+孙子节点
{
    if(!edge[a].size())
    {
        ans=ans+valu*(0+1);
        return 1;
    }
    ll child=0;
    for(int i=0;i<edge[a].size();i++)
    {
        child+=dfs(edge[a][i].next,edge[a][i].val);
    }
    ll ch=min(child+1,k);    
    ans+=(ch)*valu;

    return child+1;


}

int main()
{
    ll a;
    while(scanf("%lld%lld",&n,&k)!=EOF)
    {
        for(int i=1;i<=n;i++)edge[i].clear();
        for(ll i=0;i<n-1;i++)
        {
            node tmp;
            scanf("%lld%lld%lld",&a,&tmp.next,&tmp.val);
            edge[a].push_back(tmp);
        }
        ans=0;

        dfs(1,0);
        printf("%lld\n",ans);
    }
    return 0;

}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

(2017多校训练第三场)HDU - 6060 RXD and dividing dfs

官方题解: 把1看成整棵树的根. 问题相当于把 2∼n2\sim n2∼n每个点一个[1,k][1, k][1,k]的标号. 然后根据最小斯坦纳树的定义, (x,fax)(x, fa_x)(x...

HDU_6060 RXD and dividing 【DFS】

题目链接 题目描述给一棵树T,有n个结点。 给一个k,表示有k个集合,我们需要把2,3,4,…n号节点放入集合,要保证k个集合的并集等于{2,3,4,5n},并且集合互不相交。(集合可以为空) 然...

HDU - 6060 RXD and dividing(树的dfs)

题目大意:给你 n 个点和 n-1 条边组成一颗树,然后让你把这 n 个点分成 k 组,每一组的值为这一组所有点和 1 号 结点组成的最小斯坦纳树的边权之和。现在问你如何划分才能得到使得这k组的值最...

HDU6060RXD and dividing(思维+dfs)

RXD and dividing Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Other...

【HDU 6060 RXD and dividing】+ DFS

RXD and dividingTime Limit: 6000/3000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others...

HDU 6060-RXD and dividing(多校训练第三场->DFS)

RXD and dividing Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Othe...

【HDU6060】RXD and dividing(dfs)

RXD has a tree T, with the size of n. Each edge has a cost. Define f(S) as the the cost of the minim...

hdu 6060 RXD and dividing

链接题意:有一颗n个节点的树,现在将节点2-n分成k组,定义每组的的权值为该组内所有点加编号为1的节点相互连接所经过的边的权值的和,求k组点集最大的和。分析:使用贪心的思想,我们思考每条边对最终答案的...

RXD and dividing(HDU 6060)

RXD has a tree T, with the size of n. Each edge has a cost. Define f(S) as the the cost of the minim...

【思维】hdu 6060 RXD and dividing

数组模拟链表:http://blog.csdn.net/baidu_35643793/article/details/76850687 RXD and dividing Ti...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)