【构造+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 ...
随机推荐
- P1789 【Mc生存】插火把
题目背景 初一党应该都知道...... 题目描述 话说有一天linyorson在Mc开了一个超平坦世界,他把这个世界看成一个n*n的方阵,现在他有m个火把和k个萤石,分别放在x1,y1...xm,ym ...
- 外文翻译 《How we decide》被情感愚弄 第三节
本科论文答辩终于结束啦,一切都要继续回到正轨. 这是第三章章最后一节 书的导言 本章第二节 本章第一节 "信用卡是我的敌人."Herman Palmer这样说到.在平日,Herma ...
- javajsp,Servlet:Property 'Id' not found
avax.el.PropertyNotFoundException: Property 'Id' not found on type org.androidpn.server.model.CarSo ...
- BaseAtapter
本文用于实现一个通用的BaseAdapter类,统一产品的Adapter类,作为一个工具类,减少重复性工作,增加开发效率. 序 我们在开发项目的过程中,经常会用到ListView.GridView这一 ...
- sql查询作业执行时间
SELECT j.name AS Job_Name , h.step_id AS S ...
- C# string日期格式
百分数格式应该用“p”这个参数. 格式 原始 数据 结 果 "{0:P}" 0.40 40% 数字 {0:N2} 12.36 数字 {0:N0} 13 货币 {0:c2} $1 ...
- tree 树状构建
/*package ch.util; import com.trm.model.func.FunctionTree; import java.util.HashMap; import java.uti ...
- class 写在 import的位置 类的名字第一个字母大写 后面没括号 ES6
class 写在 import的位置 类的名字第一个字母大写 后面没括号 class ObTableDataClass {}或者 const ObTableDataClass = class { in ...
- Unexpected Exception caught setting 'username' on 'class com.bj186.crm.web.action.UserAction: Error setting expression 'username' with value ['艾格尼丝', ]
问题场景: 在使用表单向Action传递数据的时候, 遇到了这个问题, 导致了空指针异常. 问题描述: 10:14:56.622 [http-nio-8080-exec-45] ERROR com.o ...
- Hadoop集群安装指南(CHD5.9.1)(分布式+图文详解)
centos7.1,CDH5.9.1,3台机器,终极指导安装 下载链接如下: 安装文件下载链接如下: 链接:https://pan.baidu.com/s/1RQYNiWn9a-T8GXcCsoDBs ...