Codeforces 1004E
题意略。
思路:
这k个点应该放在这棵树的直径上,并且能连成一条路径。如果k比树的直径上的点要多,那么我们就不用把这k个点都用上,
只需要把这棵树直径上所有的点都覆盖上就行了。如果k比树的直径上的点要少,那么我们尽量使这k个点放在这个直径的中心位置。

这个我们可以简单说一下:
首先,把这k个点放在直径中央可以保证直径上的点到这段路径的最大距离最小。但是其他的枝叶呢,可以保证其他枝叶上的点到这一段路径的最大距离最小吗?
假设我为了迁就某个枝叶上的点,使得这段路径偏离了直径的中央,那么只能说明这段枝叶比原来接口处向外的那一部分直径还长,这是不可能的,
这只能说明这段枝叶是直径的一部分。
所以我们先找出直径,再寻找直径的中间位置,然后一遍dfs,确定整棵树上到这段路径的最远距离。
详见代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = ; struct edge{
int to,w;
edge(int a = ,int b = ){
to = a,w = b;
}
}; int deep[maxn],fa[maxn],store[maxn],tail,n,k;
vector<edge> graph[maxn]; void dfs(int node){
for(int i = ;i < graph[node].size();++i){
edge e = graph[node][i];
int to = e.to,w = e.w;
if(fa[to] == ){
if(deep[to] == -) deep[to] = deep[node] + w;
fa[to] = node;
dfs(to);
}
}
} int main(){
scanf("%d%d",&n,&k);
int from,to,w;
for(int i = ;i < n - ;++i){
scanf("%d%d%d",&from,&to,&w);
graph[from].push_back(edge(to,w));
graph[to].push_back(edge(from,w));
}
memset(deep,-,sizeof(deep));
memset(fa,,sizeof(fa));
fa[] = -;
deep[] = ;
dfs();
int ed1 = ,ed2;
for(int i = ;i <= n;++i){
if(deep[i] > deep[ed1]) ed1 = i;
}
memset(deep,-,sizeof(deep));
memset(fa,,sizeof(fa));
fa[ed1] = -;
deep[ed1] = ;
dfs(ed1);
ed2 = ed1;
for(int i = ;i <= n;++i){
if(deep[i] > deep[ed2]) ed2 = i;
}
int deepest = deep[ed2];
for(int i = ed2;i != -;i = fa[i]){
store[tail++] = i;
} int l,r;
if(tail <= k) l = ,r = tail - ;
else{
int L = ;
for(int i = ;i < tail - k + ;++i){
if(max(deepest - deep[store[i]],deep[store[i + k - ]]) < max(deepest - deep[store[L]],deep[store[L + k - ]]))
L = i;
}
l = L,r = l + k - ;
}
memset(deep,-,sizeof(deep));
memset(fa,,sizeof(fa));
fa[store[l]] = -;
for(int i = l;i <= r;++i){
deep[store[i]] = ;
}
dfs(store[l]);
int ans = ;
for(int i = ;i <= n;++i) ans = max(ans,deep[i]);
printf("%d\n",ans);
return ;
}
Codeforces 1004E的更多相关文章
- Sonya and Ice Cream CodeForces - 1004E 树的直径, 贪心
题目链接 set维护最小值贪心, 刚开始用树的直径+单调队列没调出来... #include <iostream>#include <cstdio> #include < ...
- CodeForces - 1004E Sonya and Ice Cream
题面在这里! 挺智障的一个二分...我还写了好久QWQ,退役算啦 题解见注释... /* 先对每个点记录 向子树外的最长路 和 向子树内最长路,然后二分. 二分的时候枚举链的LCA直接做就好啦. */ ...
- Codeforces #495 Div2 problem E. Sonya and Ice Cream(1004E)
网上的大多是用树的直径做的,但是一些比较巧妙的做法,来自https://www.cnblogs.com/qldabiaoge/p/9315722.html. 首先用set数组维护每一个节点所连接的边的 ...
- python爬虫学习(5) —— 扒一下codeforces题面
上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
- 【Codeforces 738C】Road to Cinema
http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...
- 【Codeforces 738A】Interview with Oleg
http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...
- CodeForces - 662A Gambling Nim
http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...
- CodeForces - 274B Zero Tree
http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...
随机推荐
- linux初学者-磁盘配额篇
linux初学者-磁盘配额篇 在使用磁盘时,只要有权限,不管什么用户都可以在其中写入数据,但是如果是多人在一个磁盘中写入数据,就会出现争议,如果一个用户将磁盘空间用完,那么其他人无法再使用.如下图所示 ...
- npm常用命令(原创)
1.对于我们下载下来的node包,假设该包存在依赖情况执行: npm install(或者npm i) 下载依赖包: 下载依赖成功过后,文件夹内会产生package-lock.json文件: 2.下载 ...
- Linux学习(一)--VMware下Linux安装和配置
本片随便将给大家讲述linux在VM虚拟机上安装及终端的安装和配置 一.Linux介绍 Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线 ...
- 如何把一个jar包导入到eclipse中
- MYSQL 时间轴数据 获取同一天数据的前3条
创建表数据 CREATE TABLE `praise_info` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID', `pic_id` va ...
- QTableView表格控件区域选择-自绘选择区域
目录 一.开心一刻 二.概述 三.效果展示 四.实现思路 1.绘制区域 2.绘制边框 3.绘制 五.相关文章 原文链接:QTableView表格控件区域选择-自绘选择区域 一.开心一刻 陪完客户回到家 ...
- jQuery插件之路(二)——轮播
还记得以前刚接触前端的时候,浏览各大网站,很多都少不了的有个轮播的效果,那个时候自己是一个彻彻底底的小白,想着这些图片滚动起来还真是有意思,是什么让这些图片在一个方向上连续的滚动呢.后来慢慢的接触多了 ...
- Zookeeeper环境搭建(二)
zk一般是有2n+1个节点组成的集群.在Zookeeper服务有两个角色,一个是leader,负责写服务和数据同步:剩下的是follower,提供读服务.(为什么是2n+1个节点请看paxos算法) ...
- powerdesign进军(二)--oracle数据源配置
目录 资源下载(oracle客户端) 配置 查看系统的数据源 powerdesign 连接数据库 title: powerdesign进军(二)--oracle数据源配置 date: 2019-05- ...
- 安装VMware14虚拟机,centos7版本的linux 软件地址
首先下载虚拟机软件和centos7的linux系统的镜像软件系统, https://pan.baidu.com/s/1cJfzpaLwB4dfe2W8gGEAPQ 两个文件 非常好用 虚拟机安装 很简 ...