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;

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

[poj 1014]Dividing的DFS解法解读和DP解法

转载来源: http://blog.csdn.net/lyy289065406/article/details/6661449 这道题比较特殊,用DFS也是对的,而且可以进行优化,即使直接n[i]...
  • zhangliang011258
  • zhangliang011258
  • 2013年07月28日 17:16
  • 779

hdu 6060 RXD and dividing 2017多校第三场第五题(思维+dfs)

hdu 6060 RXD and dividing 题目大意,一棵树有n个节点,1为根节点,将2~n这n各节点分为k部分。这k个部分没有交集,可以为空,求1到k部分的和最大。 解题思路:这里提到...
  • Merry_hj
  • Merry_hj
  • 2017年08月09日 11:16
  • 106

HDU 1728逃离迷宫(DFS或者BFS)

逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub...
  • opm777
  • opm777
  • 2014年01月11日 15:55
  • 1334

2017多校联合第三场 1005题 hdu 6060 RXD and dividing (超详细!!!)构造

题目链接 题意: 给定一棵 n 个节点的树,1 为根。现要将节点 2 ~ n 划分为 k 块,使得每一块与 根节点 形成的最小斯坦纳树的 边权值 总和最大。 看了题解之后的思考: 题解是:记有...
  • kkkkahlua
  • kkkkahlua
  • 2017年08月02日 00:00
  • 423

2017多校第3场 HDU 6060 RXD and dividing 思维,构造最优解

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6060 题意:给出一颗n个节点的树,要求将2-n号节点分成k部分,然后再将每一部分加上1号节点,定义每...
  • just_sort
  • just_sort
  • 2017年08月01日 19:54
  • 133

HDOJ/HDU 1728 逃离迷宫 DFS 深度优先搜素

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1728 深搜思路:记录4个方向和拐弯次数,若拐弯3次,则必须是当前点和终点在一条直线才满足要求,否则剪...
  • xiaozhuaixifu
  • xiaozhuaixifu
  • 2013年06月06日 23:50
  • 1582

HDU1728 逃离迷宫 DFS

这个题卡在不知道怎么判是否转弯,不过看了大神的解题就懂了,程序里的(dir!=-1 && i!=dir)就是用来判断是否转弯了。 本题我是用的dfs,找到终点时并不晕就返回真,程序并没有遍历整个图。并...
  • u013068502
  • u013068502
  • 2014年08月24日 12:06
  • 1507

HDU 找出直系亲属 (dfs+vector)

Problem Description 如果A,B是C的父母亲,则A,B是C的parent,C是A,B的child,如果A,B是C的(外)祖父,祖母,则A,B是C的grandparent,C是A...
  • h1021456873
  • h1021456873
  • 2016年02月05日 14:34
  • 345

HDU1728 逃离迷宫 DFS练习题

这道题其实单纯使用DFS实现并不难,在函数里面加一个转弯次数的形参就行。刚拿到这道题我确实也是这么做的。 但是把代码提交之后出现了DFS很常见的问题——超时,后来在讨论区发现大部门AC的代码都是使用的...
  • qq_38071217
  • qq_38071217
  • 2017年08月03日 15:56
  • 115

hdu1584 蜘蛛牌(经典dfs)

真是好题啊。。。 刚开始一看下一个状态是由上一个子问题得来的,想DP上去了,结果找不出状态方程,一百度是数位DP,还是dfs吧= =。。。 这题的dfs也很奇葩,我对dfs理解还浅啊,刚开...
  • Flynn_curry
  • Flynn_curry
  • 2016年03月01日 21:32
  • 714
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdu 6060 RXD and dividing(dfs)
举报原因:
原因补充:

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