题意略。

思路:

这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的更多相关文章

  1. Sonya and Ice Cream CodeForces - 1004E 树的直径, 贪心

    题目链接 set维护最小值贪心, 刚开始用树的直径+单调队列没调出来... #include <iostream>#include <cstdio> #include < ...

  2. CodeForces - 1004E Sonya and Ice Cream

    题面在这里! 挺智障的一个二分...我还写了好久QWQ,退役算啦 题解见注释... /* 先对每个点记录 向子树外的最长路 和 向子树内最长路,然后二分. 二分的时候枚举链的LCA直接做就好啦. */ ...

  3. Codeforces #495 Div2 problem E. Sonya and Ice Cream(1004E)

    网上的大多是用树的直径做的,但是一些比较巧妙的做法,来自https://www.cnblogs.com/qldabiaoge/p/9315722.html. 首先用set数组维护每一个节点所连接的边的 ...

  4. python爬虫学习(5) —— 扒一下codeforces题面

    上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...

  5. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

  6. 【Codeforces 738C】Road to Cinema

    http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...

  7. 【Codeforces 738A】Interview with Oleg

    http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...

  8. CodeForces - 662A Gambling Nim

    http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...

  9. CodeForces - 274B Zero Tree

    http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...

随机推荐

  1. python正则表达式与re模块-02

    正则表达式 正则表达式与python的关系 # 正则表达式不是Python独有的,它是一门独立的技术,所有的编程语言都可以使用正则 # 但要在python中使用正则表达式,就必须依赖于python内置 ...

  2. Java 常见面试题整理

    操作系统 说一下线程和进程,它们的区别 同步和异步的区别 阻塞和非阻塞的区别 操作系统中死锁的四个必要条件 mmap和普通文件读写的区别,mmap的注意点 CPU密集型和IO密集型的区别 Linux ...

  3. windows和linux下如何对拍

    对拍是各种计算机考试检查时必备工具,实际上十分强大,只要你的暴力没有写错就没有问题. 对拍的意思:(怎么有点语文课的意思雾) 对:看见'对'就可以知道有两个. 拍:就是把两个程序结果拍在一起,对照(有 ...

  4. ListView 控件总结

     1.ListView类           1.常用的基本属性:         (1)FullRowSelect:设置是否行选择模式.(默认为false) 提示:只有在Details视图该属性才有 ...

  5. 【MySQL】日常小技巧汇总,更新中……

    创建表时修改自增主键,添加 AUTO_INCREMENT=<Number> ,例如: CREATE TABLE `table_name` ( `id` int(11) unsigned N ...

  6. Mac 10.14.4 编译openjdk1.9源码 及集成clion动态调试

    警告⚠️:本文耗时很长,先做好心理准备:编译openjdk源码需要很大的耐心,因为要踩很多坑,解决很多问题,本人从编译开始到结束用了两天时间,按照本篇教程踩坑会少许:谢谢观看 一.获取openjdk源 ...

  7. 大型系列课程之-七夕告白之旅vbs篇

    也许,世间所有的美好的东西,都是需要仪式感的,遇到了一年一度的七夕节,怎么过这个节日,成了很多心中有爱的人关注的事情,七夕不浪漫,人间不值得,七夕,发源于中国,这个美好的节日,来自动人的神话故事传说牛 ...

  8. 算法与数据结构基础 - 回溯(Backtracking)

    回溯基础 先看一个使用回溯方法求集合子集的例子(78. Subsets),以下代码基本说明了回溯使用的基本框架: //78. Subsets class Solution { private: voi ...

  9. 关于修改主机名和ssh免密登录

    修改主机名的常规方法: 1.hostname name2.echo name  > /proc/sys/kernel/hostname3.sysctl kernel.hostname=name4 ...

  10. SAP Special Fields in FAGLL03 transaction

    https://wiki.scn.sap.com/wiki/display/ERPFI/Special+Fields+in+FAGLL03+transaction https://wiki.scn.s ...