【XR-3】核心城市

这题真的难啊.........

k个核心城市太麻烦,我们假设先找一个核心城市,应该放在哪里?

\(任意取一个点,它的最远端是直径的端点。\)

\(所以当这个点是直径的中点时,可以达到题目的要求(最大距离最小)\)

\(想求中点,我们就保存直径的路径,中间的点就是中点了。\)

\(然后该怎么办?其余的k-1个点怎么选?\)

\(发现7、8号节点距离可核心城市最远,目前影响答案的是他们,所以我们下一步应该把2和3号节点变成核心城市\)

\(至此,贪心策略已经出来了\)

\(在以直径中点为根的树中,我们总是选取那些maxdeep-mydeep最大的节点\)

\(其中maxdeep是当前节点能到的最大深度,也就是这个分支离核心城市最远的节点\)

\(deep是自己的深度\)

#include <bits/stdc++.h>
using namespace std;
const int maxn=200009;
struct p{
int to,nxt;
}d[maxn];int n,k,cnt=1;
int head[maxn],dis[maxn],deep[maxn],maxdeep[maxn],f[maxn];
void add(int u,int v){
d[cnt].nxt=head[u],d[cnt].to=v,head[u]=cnt++;
}
int num,juli=0;
void dfs1(int now,int ju,int fa)
{
if(ju>juli)
{
juli=ju;
num=now;
}
for(int i=head[now];i;i=d[i].nxt)
{
int v=d[i].to;
if(v==fa) continue;
dfs1(v,ju+1,now);
}
}
void dfs2(int now,int ju,int fa)
{
if(ju>juli)
{
juli=ju;
num=now;
}
for(int i=head[now];i;i=d[i].nxt)
{
int v=d[i].to;
if(v==fa) continue;
f[v]=now;
dfs2(v,ju+1,now);
}
}
void dfsz(int now,int fa)
{
maxdeep[now]=deep[now];
for(int i=head[now];i;i=d[i].nxt)
{
int v=d[i].to;
if(v==fa) continue;
deep[v]=deep[now]+1;
dfsz(v,now);
maxdeep[now]=max(maxdeep[now],maxdeep[v]);
}
}
bool com(int a,int b){
return a>b;
}
int main()
{
cin>>n>>k;
for(int i=1;i<n;i++)
{
int l,r;
cin>>l>>r;
add(l,r);add(r,l);
}
dfs1(1,0,0);//找出直径的端点
juli=0;
dfs2(num,0,0);//找出直径的路径
int mid=num;//直径的端点
for(int i=1;i<=(1+juli)/2;i++)//一共经过了juli个点
mid=f[mid];
dfsz(mid,0);
for(int i=1;i<=n;i++) deep[i]=maxdeep[i]-deep[i];
sort(deep+1,deep+1+n,com);
int ans=0;
for(int i=k+1;i<=n;i++) ans=max(ans,deep[i]+1);
cout<<ans;
}

【XR-3】核心城市(树直径)的更多相关文章

  1. LG5536 「XR-3」核心城市 树的直径

    问题描述 LG5536 题解 两次 \(\mathrm{dfs}\) 求树的直径. 然后找到树的直径的中点. 然后按照 子树中最深的点深度-自己深度 排序,贪心选取前 \(k\) 个. \(\math ...

  2. Comet OJ - Contest #9 & X Round 3 【XR-3】核心城市 【树的理解】

    一.题目 [XR-3]核心城市 二.分析 题意就是在树中确定$K$个点,满足剩下的$N-K$个点中到这$K$个点的最大距离尽可能小. 理解上肯定是确定一个根,这个根是这个图的中心. 可以通过根据结点的 ...

  3. [TJOI2017] 城市 (树的直径,贪心)

    题目链接 Solution 这道题,调了我一晚上... 一直80分 >_<|| ... 考虑到几点: 分开任意一条边 \(u\) ,那么其肯定会断成两棵树. 肯定是分开直径上的边最优,否则 ...

  4. 解题报告:luogu P5536 【XR-3】核心城市

    题目链接:P5536 [XR-3]核心城市 这题是某次月赛题. 这题我完全是看标签猜的. 优先选择直径中点即可,这里重要的是互通,很容易想到用堆维护可选的,预处理直径和距叶节点距离即可(最近),实质上 ...

  5. HDU 4607 Park Visit 两次DFS求树直径

    两次DFS求树直径方法见 这里. 这里的直径是指最长链包含的节点个数,而上一题是指最长链的路径权值之和,注意区分. K <= R: ans = K − 1; K > R:   ans = ...

  6. [HDOJ2196]Computer (树直径, 树DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2196 给一棵树,求树上各点到某点的距离中最长的距离.注意每个点都要求. 和普通求树的直径不一样,要求每 ...

  7. [HDOJ4612]Warm up(双连通分量,缩点,树直径)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4612 所有图论题都要往树上考虑 题意:给一张图,仅允许添加一条边,问能干掉的最多条桥有多少. 必须解决 ...

  8. CodeForces 455C Civilization(并查集+树直径)

    好久没有写过图论的东西了,居然双向边要开两倍空间都忘了,不过数组越界cf居然给我报MLE??这个题题意特别纠结,一开始一直不懂添加的边长是多长... 题意:给你一些点,然后给一些边,注意没有重边 环, ...

  9. luogu 4381 [IOI2008]Island 单调队列 + 基环树直径 + tarjan

    Description 你将要游览一个有N个岛屿的公园.从每一个岛i出发,只建造一座桥.桥的长度以Li表示.公园内总共有N座桥.尽管每座桥由一个岛连到另一个岛,但每座桥均可以双向行走.同时,每一对这样 ...

随机推荐

  1. Jackson优化使用实例

    Jackson优化使用实例 博客分类: Java综合   JSON的三种处理方式  Jackson提供了三种可选的JSON处理方法(一种方式及其两个变型): 流式 API:(也称为"增量分析 ...

  2. 漏洞复现环境集锦-Vulhub

    0x01 Vulhub简介 Vulhub是一个面向大众的开源漏洞靶场,无需docker知识,简单执行两条命令即可编译.运行一个完整的漏洞靶场镜像. 0x02 安装 # 安装pip curl -s ht ...

  3. search(5)- elastic4s-构建索引

    按照计划,这篇开始尝试用elastic4s来做一系列索引管理和搜索操作示范.前面提过,elastic4s的主要功能之一是通过组合Dsl语句形成json请求.那么我们先试试组合一些Dsl语句,再想办法产 ...

  4. 知识点二:HTTP超文本文件传输协议

    HTTP超文本传输协议概念: http1.1之前采用非持续链接服务器在建立连接上开销较大,http1.1之后默认采用持续连接,并有超时设置 http协议:超文本文件传输协议,用于传输文本文件,请求的方 ...

  5. 高德APP启动耗时剖析与优化实践(iOS篇)

    前言最近高德地图APP完成了一次启动优化专项,超预期将双端启动的耗时都降低了65%以上,iOS在iPhone7上速度达到了400毫秒以内.就像产品们用后说的,快到不习惯.算一下每天为用户省下的时间,还 ...

  6. [译]谈谈SpringBoot 事件机制

    要"监听"事件,我们总是可以将"监听器"作为事件源中的另一个方法写入事件,但这将使事件源与监听器的逻辑紧密耦合. 对于实际事件,我们比直接方法调用更灵活.我们可 ...

  7. stand up meeting 1/13/2016

    part 组员                工作              工作耗时/h 明日计划 工作耗时/h    UI 冯晓云  UI测试和调整:与主程序完成合并    6 查漏补缺,扫除UI ...

  8. C# 反射(一)

    刚工作没多久,需要对以往的知识进行复习和巩固.先讲讲最近在公司常用到的反射机制. 反射(Reflection):提供了封装程序集.模块和类型的对象(Type 类型).可以使用反射动态创建类型的实例,将 ...

  9. Python基础之语言简介

    python是什么 Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言,其设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特 ...

  10. Java 多线程 -- 理解锁:手动实现可重入锁和不可重入锁

    JDK提供的大多数内置锁都是可重入的,也就是 说,如果某个线程试图获取一个已经由它自己持有的锁时,那么这个请求会立 刻成功,并且会将这个锁的计数值加1,而当线程退出同步代码块时,计数器 将会递减,当计 ...