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

原创 2017年08月02日 17:30:05

官方题解:

2∼n2\sim n把1看成整棵树的根. 问题相当于把2n每个点一个[1,k][1, k][1,k]的标号. 然后根据最小斯坦纳树的定义, (x,fax)(x, fa_x)(x,fax) 这条边的贡献是 x 子树内不同标号的个数目difidif_idifi. 那么显然有difi≤min(k,szi)dif_i\leq min(k, sz_i)difimin(k,szi)szisz_iszi表示子树大小. 可以通过构造让所有difidif_idifi都取到最大值. 所以答案就是∑x=2nw[x][fax]∗min(szx,k)\sum_{x = 2}^{n}{w[x][fa_x] * min(sz_x, k)}x=2nw[x][fax]min(szx,k)时间复杂度为O(n)。O(n)O(n)位O(n)

代码如下:

#include <bits/stdc++.h>

using namespace std;

typedef long long int LL;
const int MOD = 1e9 + 7;
const int MAX_N = 1e6 + 5;
const int INF = 0x3f3f3f3f;
int n, k;
struct edge
{
    int to;
    int cost;
};
vector<edge> G[MAX_N];
int siz[MAX_N];
int pre[MAX_N];

void dfs(int u, int fa)
{
    siz[u] = 1;
    for (unsigned i = 0; i < G[u].size(); i++)
    {
        int v = G[u][i].to;
        int w = G[u][i].cost;
        if (v == fa)
            continue;
        dfs(v, u);
        pre[v] = w;
        siz[u] += siz[v];
    }
}

int main()
{
    //freopen("test.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
    cin.sync_with_stdio(false);
    while (cin >> n >> k)
    {
        for (int i = 0; i < MAX_N; i++)
            G[i].clear();
        for (int i = 1; i < n; i++)
        {
            int u, v, cost;
            cin >> u >> v >> cost;
            G[u].push_back({v, cost});
            G[v].push_back({u, cost});
        }
        dfs(1, -1);
        LL ans = 0;
        for (int i = 2; i <= n; i++)
            ans += (LL)pre[i] * min(siz[i], k);
        cout << ans << endl;
    }
    return 0;
}


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

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
  • 103

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

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

2017年多校联合训练 第一场(北航)

Link 官方题解1001 Add More Zero 题目链接 hdoj6033 2^n在减了1之后位数是不会改变的#include using namespace std; int main...
  • qyqyqyqyq
  • qyqyqyqyq
  • 2017年07月27日 10:20
  • 332

2017多校训练赛第一场 HDU 6039 Gear Up(线段树+并查集)

这题其实没有想象中的那么难,只是当时没有时间去想清楚。         大致题意:给你一些齿轮,有些齿轮是共边(即线速度相同),有些齿轮是共轴(即角速度相同),每个齿轮都有自己的半径而且大小都是2的次...
  • u013534123
  • u013534123
  • 2017年07月26日 14:34
  • 622

2017杭电多校第三场 1003 Kanade's sum(hdu6058 区间内第k大)

Kanade’s sum Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)  Tota...
  • yiya_eryi
  • yiya_eryi
  • 2017年08月02日 10:58
  • 247

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

HDU 多校第三场

HDU 4630 No Pain No Game 思路: 考虑从左到右扫描,对于每个数,记录在它之前出现,并且最靠右边的那个它的倍数,用previ表示。考虑当前数i的所有约数x,对于所有r >= i,...
  • paradiserparadiser
  • paradiserparadiser
  • 2013年07月31日 03:53
  • 972

2017湖南多校第三场

C(chy) 给出两个n*n的矩阵A,B.判断A*A == B? 构造一个n*1的随机矩阵C。 问题转化为A*A*C == B*C. 即A*(A*C) == B*C。这样复杂度就降低到了n^2...
  • Imnotzox
  • Imnotzox
  • 2017年03月19日 16:29
  • 190

2017杭电多校联赛第三场-RXD and dividing (hdu6060)最小生成树

RXD and dividing Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Other...
  • wang_heng199
  • wang_heng199
  • 2017年08月02日 16:04
  • 113

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

转载来源: http://blog.csdn.net/lyy289065406/article/details/6661449 这道题比较特殊,用DFS也是对的,而且可以进行优化,即使直接n[i]...
  • zhangliang011258
  • zhangliang011258
  • 2013年07月28日 17:16
  • 773
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:(2017多校训练第三场)HDU - 6060 RXD and dividing dfs
举报原因:
原因补充:

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