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 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...
随机推荐
- HashSet源码解读
一:先看其实现了哪些接口和继承了哪些类 1.实现了Serializable接口,表明它支持序列化. 2.实现了Cloneable接口,表明它支持克隆,可以调用超类的clone()方法进行浅拷贝. 3. ...
- 最短代码实现包含100个key的字典,且每个value值不同
最短代码实现包含100个key的字典,且每个value值不同 {x:x*2 for x in range(100)}
- .net持续集成sonarqube篇之 sonarqube与jenkins集成(插件模式)
系列目录 Jenkins通过插件集成Sonarqube 通过上一节我们了解了如何配置以使jenkins ci环境中可以执行sonarqube构建,其实Sonarqube官方也提供了jenkins插件以 ...
- tomcat配置启动文件
修改tomcat到指定文件夹 conf -> server.xml <Host name="localhost" appBase="webapps" ...
- 夯实Java基础(十一)——内部类
1.内部类的概念 内部类顾名思义:将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类.对于很多Java初学者来说,内部类学起来真的是一头雾水,根本理解不清楚是个什么东西,包括我自己(我太菜 ...
- Spring aop 影响本地事务的回滚总结
1 @Before 不会,因为还没执行到service的业务逻辑 2 @ After 默认情况下,报错会影响事务回滚., 当设置@Order属性并设置值优先级大小, 即使报错也不会回滚了 ...
- 3PHP如何用PDO的连接方式方式导出mysql数据
首先连接mysql,具体看上一篇 接下来在try{}中加入以下代码 $query="select * from 你的数据表名称" //$query的内容给个SQL ...
- Netty学习(二)-Helloworld Netty
这一节我们来讲解Netty,使用Netty之前我们先了解一下Netty能做什么,无为而学,岂不是白费力气! 1.使用Netty能够做什么 开发异步.非阻塞的TCP网络应用程序: 开发异步.非阻塞的UD ...
- Eclipse高级操作 远程调试
Eclipse高级操作 远程调试 JPDA是SUN JDK自带的远程调试机制.它提供了一套标准的调试接口,可以从虚拟机一级允许外界用特定协议探测虚拟机内部的运作细节.只要你装了JDK1.2以上的SUN ...
- 使用bibtex为latex论文添加参考文献
此文以引用Shannon的Prediction and Entropy of Printed English为例 1. bib文件 1.1 准备工作 进入Google Scholar 点击设置 ...