题意:

有一棵树,树上有许多人,他们要聚会,找一个点使得所有人到这个点的距离的最大值最小。

题解:

首先,以一个有人的点为根,求一个生成树,删掉所有没有人的子树,保证所有的悬挂点(只连接一条边的点)都是有人的节点,以保证后面求出的直径的两端是两个有人节点。为什么非得以有人的节点为根呢?因为如果找了一个没人的节点当根,而这个根又恰好是一个悬挂点,那么可以想象,这个悬挂点可能成为直径的端点。

其次,求树的直径,就是树上两点的最长距离,这个直径的两个端点必然都是悬挂点。

直径/2向上取整就是半径,也就是题目所求距离。

求直径可跑两遍dfs,第一遍从任意点开始,找出与此点距离最大点,第二遍从这个点开始,找出与这个点距离最大点。

赛时想的是树的重心,wa了,想像一棵树上半部分是一条长链,下半部分是密密麻麻的儿子接在长链一端。然后又想了拓扑求直径,T了。

但是发现拓扑排序的轮数其实就是树的半径,不知道这个结论有什么用。

#include<iostream>
#include<vector>
#define INF 0x3f3f3f3f
#include<queue>
#include<cstring>
#include<set>
using namespace std;
vector<int> lnk[];
vector<int> sclnk[];//生成树
int n; int scn;//生成树的节点数
bool ren[];
bool dfs(int fa,int u){
bool ok=ren[u];
for(int i=;i<lnk[u].size();i++){
int v=lnk[u][i];
if(v==fa)continue;
bool tr=dfs(u,v);
if(tr){
sclnk[u].push_back(v);
sclnk[v].push_back(u);
scn++;
}
ok=ok||tr;
}
return ok;
}
int kg;
void prt(int fa,int u){
//把生成树打印出来
for(int i=;i<=kg;i++)printf(" ");
printf("%d\n",u);
kg++;
for(int i=;i<sclnk[u].size();i++){
int v=sclnk[u][i];
if(v==fa)continue;
prt(u,v);
}
kg--;
} bool vis[];
int size[]; int dis[];
struct P{
int n,dis;
P(){}
P(int n1,int dis1){
n=n1;dis=dis1;
}
friend bool operator >(const P &a,const P &b){
return a.dis>b.dis;
}
friend bool operator <(const P &a,const P &b){
return a.dis<b.dis;
}
}; void ddfs(int st) {
vis[st] = ;
for(int i = ;i<sclnk[st].size();i++) {
int to =sclnk[st][i];
if(!vis[to]) {
dis[to] = dis[st] +;
ddfs(to);
}
}
} int main(){
//把一个有人的点揪出来当树根
//删掉无人的子树
//找出树的直径
int k;
scanf("%d %d",&n,&k);
for(int i=;i<n;i++){
int a,b;
scanf("%d %d",&a,&b);
lnk[a].push_back(b);
lnk[b].push_back(a);
}
int r1;
for(int i=;i<=k;i++){
int q;
scanf("%d",&q);
r1=q;
ren[q]=;
}
dfs(-,r1);
// prt(r1);
//求生成树 memset(dis,INF,sizeof dis);
dis[r1] = ;
ddfs(r1);
//求树的直径
int maxi=r1;
for(int i=;i<=n;i++){
if(dis[i]!=INF && dis[i]>dis[maxi])maxi=i;
} memset(dis,INF,sizeof dis);
memset(vis,,sizeof vis);
dis[maxi] = ;
ddfs(maxi); int maxx=;
for(int i=;i<=n;i++){
// printf("%d ",dis[i]);
if(dis[i]!=INF)maxx=max(maxx,dis[i]);
}
printf("%d\n",(maxx+)/);
return ;
}

牛客多校第四场 A meeting 树的半径的更多相关文章

  1. 2019牛客多校第四场A meeting——树的直径

    题意: 一颗 $n$ 个节点的树上标有 $k$ 个点,找一点使得到 $k$ 个关键结点的最大距离最小. 分析: 问题等价于求树的直径,最小距离即为直径除2向上取整. 有两种求法,一是动态规划,对于每个 ...

  2. 2019牛客多校第四场 A meeting

    链接:https://ac.nowcoder.com/acm/contest/884/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他语言10485 ...

  3. 2019牛客多校第四场A meeting 思维

    meeting 题意 一个树上有若干点上有人,找出一个集合点,使得所有人都到达这个点的时间最短(无碰撞) 思路 就是找树的直径,找直径的时候记得要找有人的点 #include<bits/stdc ...

  4. 牛客多校第四场sequence C (线段树+单调栈)

    牛客多校第四场sequence C (线段树+单调栈) 传送门:https://ac.nowcoder.com/acm/contest/884/C 题意: 求一个$\max {1 \leq l \le ...

  5. 牛客多校第3场 J 思维+树状数组+二分

    牛客多校第3场 J 思维+树状数组+二分 传送门:https://ac.nowcoder.com/acm/contest/883/J 题意: 给你q个询问,和一个队列容量f 询问有两种操作: 0.访问 ...

  6. 牛客多校第四场 F Beautiful Garden

    链接:https://www.nowcoder.com/acm/contest/142/F来源:牛客网 题目描述 There's a beautiful garden whose size is n ...

  7. 牛客多校第四场 G Maximum Mode

    链接:https://www.nowcoder.com/acm/contest/142/G来源:牛客网 The mode of an integer sequence is the value tha ...

  8. 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数

    目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...

  9. 2019年牛客多校第四场 B题xor(线段树+线性基交)

    题目链接 传送门 题意 给你\(n\)个基底,求\([l,r]\)内的每个基底是否都能异或出\(x\). 思路 线性基交板子题,但是一直没看懂咋求,先偷一份咖啡鸡板子写篇博客吧~ 线性基交学习博客:传 ...

随机推荐

  1. redis 分析rdb中key

    1.问题: 单位一个redis集群内存报警,想找出所有的key的列表? 2.解决办法: 网上搜索是可以用redis-rdb-tools 这个工具进行分析 (1)centos6 默认安装python2. ...

  2. Jenkins 搭建 .NET Core 持续集成环境

    关于c#的.Net FrameWork 的集成环境以及MsBuild的配置可以看     jenkins搭建.NET FrameWork持续集成环境 这篇文章     关于.NET Core 这个项目 ...

  3. Java再谈方法

    1.3再谈方法 1.3.1 什么是方法(函数) ①方法是类或对象行为特征的抽象,也称为函数. ②Java里的方法不能独立存在,所有的方法必须定义在类里. 修饰符 返回值类型 方法名(参数类型 形参1, ...

  4. NX二次开发-UFUN获取图层类别的信息UF_LAYER_ask_category_info

    1 NX11+VS2013 2 3 #include <uf.h> 4 #include <uf_ui.h> 5 #include <uf_layer.h> 6 7 ...

  5. [zz]winform导入excel

    winfrom导入excel内容,要求能够excel中多个工作簿的内容.代码如下: #region 导入excel数据 private void button2_Click(object sender ...

  6. ICPC 2018 焦作区域赛

    // 2019.10.7 练习赛 // 赛题来源:2018 ICPC 焦作区域赛 // CF链接:http://codeforces.com/gym/102028 A Xu Xiake in Hena ...

  7. 转:手机端html5触屏事件(touch事件)

    touchstart:触摸开始的时候触发 touchmove:手指在屏幕上滑动的时候触发 touchend:触摸结束的时候触发 而每个触摸事件都包括了三个触摸列表,每个列表里包含了对应的一系列触摸点( ...

  8. Centos 7 ping 不通外网

    首先检查添加DNS是否正常,如不存在则添加dns: [root@cgls]# vim /etc/resolv.conf nameserver 114.114.114.114 nameserver 8. ...

  9. IntelliJ IDEA无法创建springboot项目解决办法

    最佳解决办法:IntelliJ IDEA---右键---以管理员身份运行. 方法二: 1.打开控制面板--系统和安全--windows防火墙 2.找到自己的默认浏览器,打勾,这里是谷歌浏览器 3.打开 ...

  10. neo4j常用cypher语句

    阅读更多 1.删除带有关系的节点   a.先删除关系 match (n:Node)-[r:关系名称]-() where (n...条件) delete r   b.删除节点 match (n:Node ...