【构造+DFS】2017多校训练三 HDU 6060 RXD and dividing
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的更多相关文章
- 【链表】2017多校训练三 HDU 6058 Kanade's sum
acm.hdu.edu.cn/showproblem.php?pid=6058 [题意] 给定一个排列,计算 [思路] 计算排列A中每个数的贡献,即对于每个ai,计算有ni个区间满足ai是区间中的第k ...
- HDU 6060 - RXD and dividing | 2017 Multi-University Training Contest 3
/* HDU 6060 - RXD and dividing [ 分析,图论 ] | 2017 Multi-University Training Contest 3 题意: 给一个 n 个节点的树, ...
- HDU 6060 RXD and dividing(dfs 思维)
RXD and dividing Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Other ...
- 【(好题)组合数+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 ...
- 【极角排序+双指针线性扫】2017多校训练七 HDU 6127 Hard challenge
acm.hdu.edu.cn/showproblem.php?pid=6127 [题意] 给定平面直角坐标系中的n个点,这n个点每个点都有一个点权 这n个点两两可以连乘一条线段,定义每条线段的权值为线 ...
- 【双向bfs】2017多校训练十 HDU 6171 Admiral
[题意] 现在给出一个三角矩阵,如果0编号的在点(x,y)的话,可以和(x+1,y),(x-1,y),(x+1,y+1),(x-1,y-1)这些点进行交换. 我们每一次只能对0点和其他点进行交换.问最 ...
- HDU 6060 RXD and dividing(思维+计算贡献值)
http://acm.hdu.edu.cn/showproblem.php?pid=6060 题意: 给定一棵 n 个节点的树,1 为根.现要将节点 2 ~ n 划分为 k 块,使得每一块与根节点形成 ...
- HDU 6060 RXD and dividing(LCA)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6060 [题目大意] 给一个n个节点的树,要求将2-n号节点分成k部分, 然后将每一部分加上节点1, ...
- hdu6060[贪心+dfs] 2017多校3
/* hdu6060[贪心+dfs] 2017多校3*/ #include <bits/stdc++.h> using namespace std; typedef long long L ...
随机推荐
- json字符串和字典类型的相互转换
在开发过程中,有时候需要将json字符串转为字典类型,反之亦然,通常采用.Net的开源类库Newtonsoft.Json进行序列化,这里我也是采用这个,不过我更喜欢写扩展方法方便在项目的调用. 首先新 ...
- 【转】javap -c命令详解
javap -c命令详解 一直在学习Java,碰到了很多问题,碰到了很多关于i++和++i的难题,以及最经典的String str = "abc" 共创建了几个对象的疑难杂症. 知 ...
- <meta>详解
一.元数据和<meta> 元数据是描述以提供关于其他数据的数据,在<meta>中,html document是被描述的数据,meta标签中包括的数据是描述html docume ...
- 自己动手实现Spring IoC框架
钻研Spring 源码也有一段时间了,对Spring IoC的实现原理理解算是比较透彻了,要实现一款IoC容器,简单的概括无非需要以下几个步骤: 1.定义用来描述bean的配置的Java类,例如我们有 ...
- laravel学习笔记(三)
模型传值 路由: Route::get('/posts/{post}','\App\Http\Controllers\PostController@show'); 方法: public functio ...
- git 初识
现在平时用的都是SVN,感觉还是挺好用的.就是有的时候解决冲突的时候有点麻烦.但这样也是不可避免的. 今天看来下GIT,同样是版本控制,GIT的原理,和SVN还是不一样的.我个人的理解,SVN是对每个 ...
- 如何开发 Laravel 扩展包并发布到 Composer
如何开发 Laravel 扩展包并发布到 Composer 发布于 2019-01-22 cxp1539 1074 Vie 开发扩展包 我们来做一个根据第一个字符或者汉字生成头像的larave ...
- php bz2扩展安装
php bz2扩展安装 2017年09月22日 14:14:36 Cookie_1030 阅读数:1781 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn ...
- 吸顶条 ---- jQ写法
<script> $(function () { var barTop = $('#bar').offset().top; //on方法相当于原生的绑定 $(window).on('scr ...
- final关键字所修饰的类有什么特点
Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量. final类不能被继承,没有子类,final类中的方法默认是final的. final方法 ...