题意略。

思路:

这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. TP 5.0 架构 简介

    TP 5.0 架构 简介 thinkphp 5.0 为API开发而设计的的高性能框架,是与以往thinkphp5.0以下版本大不相同的新型框架,病对以颠覆和重构版本,采用全新的架构思想,引入了更多的P ...

  2. DedeCMS自定义表单制作和调用办法

    [摘要]在很多建站需求中,需要一些额外的表单供前台用户提交,以便于收集.统计.分析及处理更多的数据,利用DedeCMS自带提供的自定义表单功能即可满足大多数的此类需求,本文就讲一下如何使用DedeCM ...

  3. Jenkins-slave实现并行的自动化测试

    前言 上篇文章搭建了Jenkins-slave的分布式测试环境,我一直在想一个问题,使用这种模式能不能实现并发的自动化测试?我的想法是:同一套UI自动化的测试代码,是否能够通过一个Job绑定多个sla ...

  4. Linux学习笔记07之shell

    shell从广义上分为两类: GUI:GNOME KDE XFACE等 CLI:sh csh bash shell启动:当用户登录完成后,系统会自动启动shelll程序 进程:应用程序的副本,用PID ...

  5. 这 3 个 Set 集合的实现有点简单,那来做个总结吧

    Set 接口是 Java Collections Framework 中的一员,它的特点是:不能包含重复的元素,允许且最多只有一个 null 元素.Java 中有三个常用的 Set 实现类: Hash ...

  6. 虚IP解决程序连只读服务器故障漂移

    目前公司有一套核心交易数据库配置了AlWaysON,SQL 2012版本, 1主4从, 其从库(8,14, 8.15) 这2台只读的从数据库服务器, 后台程序和wms等很多程序,都是直接配置IP连接这 ...

  7. 使用 PowerShell 远程管理

    要求 PowerShell 版本要求至少是2.0版本以上,目前PowerShell 2.0 支持最低的操作系统版本为Windows XP.本次操作使用的是 PowerShell 5.1 请使用管理员身 ...

  8. [Pulsar系列] 10分钟学会Pulsar消息系统概念

    Apache Pulsar Pulsar是一个支持多租户的.高性能的服务与服务之间消息通讯的解决方案,最初由雅虎开发,现在由Apache软件基金会管理. Pulsar的主要特性如下: Pulsar实例 ...

  9. C#连接SQL Anywhere 12 数据库

    using System;using System.Data.Common; namespace ConsoleApplication27{    class Program    {        ...

  10. Java基础:数组Array转成List的几种方法

    在编写Java程序中,经常要用的一个转换就是数组和List对象之间的互转. 最简单的方法就是遍历 数组,然后将数组元素依次添加进list中. 此方法略,虽然方法很简单,但总感觉这样的方法有点笨 第二种 ...