acm.hdu.edu.cn/showproblem.php?pid=6060

【题意】

  • 给定一棵以1为根的树,把这颗树除1以外的结点划分为k个集合(可以有空集),把1加入划分后的集合
  • 每个集合的结点形成一棵最小生成树
  • 所有最小生成树的权值之和最大化

【思路】

  • 最小生成树,每个点u到root 1都要有唯一的一条路径,那么显然,u到1沿路的每条边贡献都为1
  • 现在考虑每条边的贡献
  • 对于某条边uv,v是离根更远的结点,以v为根的子树大小为sz[v],显然我们可以通过把sz[v]个结点划分到sz[v]个不同的集合中,使得uv的贡献为sz[v]
  • 当然,sz[v]大于k时我们只能取k

【Accepted】

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
#include<map>
#include<vector>
using namespace std;
typedef long long ll;
int n,k;
const int maxn=2e6+;
struct node
{
int v;
ll c;
node(int _v,ll _c):v(_v),c(_c){}
};
vector<node> vec[maxn];
ll ans;
int sz[maxn];
int DFS(int u,int pa)
{
sz[u]=;
for(int i=;i<vec[u].size();i++)
{
int v=vec[u][i].v;
if(v==pa) continue;
sz[u]+=DFS(v,u);
ll cnt=min(sz[v],k);
ans+=vec[u][i].c*cnt;
}
return sz[u];
}
int main()
{
while(scanf("%d%d",&n,&k)!=EOF)
{
for(int i=;i<maxn;i++)
{
vec[i].clear();
}
memset(sz,,sizeof(sz));
for(int i=;i<n-;i++)
{
int u,v;
ll c;
scanf("%d%d%lld",&u,&v,&c);
vec[u].push_back(node(v,c));
vec[v].push_back(node(u,c));
}
ans=0ll;
DFS(,-);
printf("%lld\n",ans);
}
return ;
}

vector注意多组数据要清空

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
#include<map>
#include<vector>
using namespace std;
typedef long long ll;
int n,k;
const int maxn=2e6+;
struct edge
{
int to;
int nxt;
ll c;
}e[maxn];
ll ans;
int sz[maxn];
int head[maxn];
int tot;
void init()
{
memset(head,-,sizeof(head));
memset(sz,,sizeof(sz));
tot=;
} void add(int u,int v,ll c)
{
e[tot].to=v;
e[tot].nxt=head[u];
e[tot].c=c;
head[u]=tot++;
} int DFS(int u,int pa)
{
sz[u]=;
for(int i=head[u];i!=-;i=e[i].nxt)
{
int v=e[i].to;
ll c=e[i].c;
if(v==pa) continue;
sz[u]+=DFS(v,u);
ll cnt=min(sz[v],k);
ans+=cnt*c;
}
return sz[u];
}
int main()
{
while(scanf("%d%d",&n,&k)!=EOF)
{
init();
for(int i=;i<n-;i++)
{
int u,v;
ll c;
scanf("%d%d%lld",&u,&v,&c);
add(u,v,c);
add(v,u,c);
}
ans=;
DFS(,-);
printf("%lld\n",ans);
}
return ;
}

邻接表双向边注意边数要1e6*2

【注意事项】

  • 多组数据vector要清空,不然会wa而且stackoverflow
  • 双向边要开两倍的数组,不然会RE

【构造+DFS】2017多校训练三 HDU 6060 RXD and dividing的更多相关文章

  1. 【链表】2017多校训练三 HDU 6058 Kanade's sum

    acm.hdu.edu.cn/showproblem.php?pid=6058 [题意] 给定一个排列,计算 [思路] 计算排列A中每个数的贡献,即对于每个ai,计算有ni个区间满足ai是区间中的第k ...

  2. HDU 6060 - RXD and dividing | 2017 Multi-University Training Contest 3

    /* HDU 6060 - RXD and dividing [ 分析,图论 ] | 2017 Multi-University Training Contest 3 题意: 给一个 n 个节点的树, ...

  3. HDU 6060 RXD and dividing(dfs 思维)

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

  4. 【(好题)组合数+Lucas定理+公式递推(lowbit+滚动数组)+打表找规律】2017多校训练七 HDU 6129 Just do it

    http://acm.hdu.edu.cn/showproblem.php?pid=6129 [题意] 对于一个长度为n的序列a,我们可以计算b[i]=a1^a2^......^ai,这样得到序列b ...

  5. 【极角排序+双指针线性扫】2017多校训练七 HDU 6127 Hard challenge

    acm.hdu.edu.cn/showproblem.php?pid=6127 [题意] 给定平面直角坐标系中的n个点,这n个点每个点都有一个点权 这n个点两两可以连乘一条线段,定义每条线段的权值为线 ...

  6. 【双向bfs】2017多校训练十 HDU 6171 Admiral

    [题意] 现在给出一个三角矩阵,如果0编号的在点(x,y)的话,可以和(x+1,y),(x-1,y),(x+1,y+1),(x-1,y-1)这些点进行交换. 我们每一次只能对0点和其他点进行交换.问最 ...

  7. HDU 6060 RXD and dividing(思维+计算贡献值)

    http://acm.hdu.edu.cn/showproblem.php?pid=6060 题意: 给定一棵 n 个节点的树,1 为根.现要将节点 2 ~ n 划分为 k 块,使得每一块与根节点形成 ...

  8. HDU 6060 RXD and dividing(LCA)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6060 [题目大意] 给一个n个节点的树,要求将2-n号节点分成k部分, 然后将每一部分加上节点1, ...

  9. hdu6060[贪心+dfs] 2017多校3

    /* hdu6060[贪心+dfs] 2017多校3*/ #include <bits/stdc++.h> using namespace std; typedef long long L ...

随机推荐

  1. neo4j(图数据库)是什么?

    不多说,直接上干货! 作为一款强健的,可伸缩的高性能数据库,Neo4j最适合完整的企业部署或者用于一个轻量级项目中完整服务器的一个子集存在. 它包括如下几个显著特点: 完整的ACID支持 高可用性 轻 ...

  2. js数据类型之判断

    js有几种类型,具体是:字符串(String).数字(Number).布尔(Boolean).数组(Array).对象(Object).空(Null).未定义(Undefined). js提供了typ ...

  3. 使用gitblit 在windows平台搭建git服务器

    1.下载jdk,安装并且配置好环境变量 2.下载gitblit 直接解压无需安装 3.配置gitblit 1.修改gitblit安装目录下的data文件下的gitblit.properties.将in ...

  4. AJPFX总结之Socket编程

    一.Socket简介 Socket是进程通讯的一种方式,即调用这个网络库的一些API函数实现分布在不同主机的相关进程之间的数据交换. 几个定义: (1)IP地址:即依照TCP/IP协议分配给本地主机的 ...

  5. 初学者可能不知道的vue技巧

    前言 大家好,这里是@IT·平头哥联盟,我是首席甩锅官——老金,今天给大家分享的,一些日常中神秘而又简单的vue的实用小技巧,以及我在我司项目中实用vue的总结和坑,跟大家一起分享,希望能给其他攻城狮 ...

  6. 洛谷 P2866 [USACO06NOV]糟糕的一天Bad Hair Day

    题目描述 Some of Farmer John's N cows (1 ≤ N ≤ 80,000) are having a bad hair day! Since each cow is self ...

  7. 将Chrome调试器里的JavaScript变量保存成本地JSON文件

    我写了一个系列的文章,主要用来搜集一些供程序员使用的小工具,小技巧,帮助大家提高工作效率. 推荐一个功能强大的文件搜索工具SearchMyFiles 介绍一个好用的免费流程图和UML绘制软件-Diag ...

  8. 版本号对比方案及参考代码(Objective-C,Java,JavaScript)

    常用版本号 如 2.0.1 与 2.0.2 相比  2.0.2是比2.0.1要新的 那么该如何对这个版本号进行对比 这里有一个比较简单的实现方案 2.0.1 这种格式可以拆分为多个部分 如这里的2是大 ...

  9. 获取Java接口的所有实现类

    获取Java接口的所有实现类 前言:想看基于spring 的最简单实现方法,请直接看 第七步. 本文价值在于 包扫描的原理探究和实现 一.背景 项目开发中,使用Netty做服务端,保持长连接与客户端( ...

  10. Linux centos7开机界面出现多个选项

    centos7开机界面出现多个选项时 前面几个选项正常启动,最后一个选项急救模式启动(系统出项问题不能正常启动时使用并修复系统) 在CentOS更新后,并不会自动删除旧内核.所以在启动选项中会有多个内 ...