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. python实战之爬取喜玛拉雅专辑信息

    import urllib.request import json from lxml import etree url='http://www.ximalaya.com/dq/8.ajax' hea ...

  2. 【学习笔记】后端中的MVC和前端MVVM的关系

  3. match,location,history

    哇,平常写路由时基本就是简单的按照组件给的示例写,从来没有考虑为什么,又遇见了路由相关的问题,先记录一下问题,好好捋一下,哎,好香要个大佬来带带我呀,每次遇到问题要解决好久 问题: 判断是否登录之后跳 ...

  4. XDroidMvp 轻量级的Android MVP快速开发框架

    XDroidMvp是XDroidAndroid快速开发框架的MVP版本,其使用方式类似于XDroid,大部分源码也来自XDroid. XDroidMvp主要会有这些特性: 无需写Contract! 无 ...

  5. 如何优化APK的大小

    项目使用AS打出的包明显比Eclipse打出的包要大一些,还是蛮费解.于是百度了一翻, 原来Eclipse使用的proguard能够遍历所有的java代码,把无用的代码去掉才生成dex文件,同 时对r ...

  6. mysql 查询数据库参数命令

    1.select @@tx_isolation;    查询数据库设置的事务隔离级别 2.desc table_name;  显示表设计 3.show create table table_name; ...

  7. H5拖拽事件的完整过程和语法

    <!DOCTYPE HTML> <html> <head> <style type="text/css"> #div1 { widt ...

  8. NYOJ 题目42 一笔画问题

    一笔画问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下 ...

  9. MongoDB最简单的入门教程之二 使用nodejs访问MongoDB

    在前一篇教程 MongoDB最简单的入门教程之一 环境搭建 里,我们已经完成了MongoDB的环境搭建. 在localhost:27017的服务器上,在数据库admin下面创建了一个名为person的 ...

  10. Spring事务管理全面分析

    Spring 事务属性分析什么是事物  事务管理对于企业应用而言至关重要.它保证了用户的每一次操作都是可靠的,即便出现了异常的访问情况,也不至于破坏后台数据的完整性.就像银行的自助取款机,通常都能正常 ...