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 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...
随机推荐
- 并查集_HDU 1232_畅通工程
某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可). ...
- HTTP_3_HTTP报文
用户HTTP协议交互的信息被称为HTTP报文 简单的请求报文和响应报文实例 HTTP传输过程中常用设置 提升传输速率 编码压缩传输 (常见压缩格式:gzip compress deflate ) 分块 ...
- string的学习
原:https://blog.csdn.net/qq_37941471/article/details/82107077 一. string的构造函数的形式: string str:生成空字符串 st ...
- SpringBoot底层原理及分析
一,Spring Boot简介 1.什么是Spring Boot: SpringBoot是由Pivotal团队提供的框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程. 该框架使用了特 ...
- Eclipse Other Projects小问题
Eclipse 不知什么时候多了个 "Other Projects" 文件夹,所有的项目又多了一层目录,如图所示: 虽然对功能没任何影响,但每次打开有些麻烦,多少感觉有些不爽…… ...
- Linux 文件系统相关的基本概念
本文介绍 Linux 文件系统相关的基本概念. 硬盘的物理组成 盘片硬盘其实是由单个或多个圆形的盘片组成的,按照盘片能够容纳的数据量,分为单盘(一个硬盘里面只有一个盘片)或多盘(一个硬盘里面有多个盘片 ...
- UE4 本地化不起作用 SetCurrentCulture
UE4 本地化 FInternationalization::Get ().SetCurrentCulture ( TEXT ( "en" ) ) FInternationaliz ...
- python 处理json数据
python 处理 json数据 以下是登录账号后获取的json数据,headers中注意加入cookie值 需要处理的数据如下: 全部代码如下 #!/usr/bin/env python # -*- ...
- 关于python中的特殊方法
研究了几个小时,大概对python中的特殊方法一知半解,现在写写自己的理解,以及记录一些找到的资源.待自己有比较深入理解的时候,再来更新 https://docs.python.org/3/refer ...
- 为什么阿里Java规约禁止使用Java内置线程池?
IDEA导入阿里规约插件,当你这样写代码时,插件就会自动监测出来,并给你红线提醒. 告诉你手动创建线程池,效果会更好. 在探秘原因之前我们要先了解一下线程池 ThreadPoolExecutor 都有 ...