题目大意:

  一棵树,在其中找两个点,使得其他点到这两个的距离的较小值的最大值的最小值及其方案。

思路:

  首先显然一棵树的直径的中点到其他点的距离的最大值必定比其他点的小。

  那么感性思考一下就将一棵树的直径平分成两段,在找分成的两棵树的直径的中点。

  PS:dfs貌似要爆栈,用非递归或bfs。

代码:

 #include<cstdio>
const int M=;
int ed,cnt,fa[M],q[M],dep[M],v[M<<],nex[M<<],hea[M];
bool vis[M]; int read()
{
int x=; char ch=getchar();
while (ch<'' || ch>'') ch=getchar();
while (ch>='' && ch<='') x=(x<<)+(x<<)+ch-,ch=getchar();
return x;
} void add(int x,int y) { v[++cnt]=y,nex[cnt]=hea[x],hea[x]=cnt; } void build(int s)
{
int h=,t=; fa[s]=;
dep[q[]=ed=s]=;
while (h^t)
{
int x=q[++h],y,i;
for (i=hea[x];i;i=nex[i])
if (!vis[y=v[i]] && y^fa[x])
{
dep[y]=dep[fa[q[++t]=y]=x]+;
if (dep[ed]<dep[y]) ed=y;
}
}
} void getdis(int x) { build(x); build(ed); } int main()
{
for (int T=read();T;--T)
{
int n=read(),ans,i,len,x,y,z;
for (cnt=i=;i<=n;++i) hea[i]=;
for (i=;i<n;++i)
{
x=read(),y=read();
add(x,y),add(y,x);
}
getdis(); len=dep[x=ed];
for (;dep[x]!=(len>>)+;x=fa[x]);
vis[x]=; getdis(fa[x]); len=dep[y=ed];
for (;dep[y]!=(len>>)+;y=fa[y]);
ans=len>>; vis[x]=; vis[z=fa[x]]=;
getdis(x); len=dep[ed]; vis[z]=;
for (;dep[ed]!=(len>>)+;ed=fa[ed]);
len=len>>; if (ans<len) ans=len;
printf("%d %d %d\n",ans,y,ed);
}
return ;
}

ZOJ-3820 Building Fire Stations 题解的更多相关文章

  1. zoj 3820 Building Fire Stations(二分法+bfs)

    题目链接:zoj 3820 Building Fire Stations 题目大意:给定一棵树.选取两个建立加油站,问说全部点距离加油站距离的最大值的最小值是多少,而且随意输出一种建立加油站的方式. ...

  2. zoj 3820 Building Fire Stations 树的中心

    Building Fire Stations Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.zju.edu.cn/onlinejudge ...

  3. zoj 3820 Building Fire Stations (二分+树的直径)

    Building Fire Stations Time Limit: 5 Seconds      Memory Limit: 131072 KB      Special Judge Marjar ...

  4. ZOJ 3820 Building Fire Stations 求中点+树的直径+BFS

    题意:给一棵树,要求找出两个点,使得所有点到这两个点中距离与自己较近的一个点的距离的最大值(所有点的结果取最大的值,即最远距离)最小. 意思应该都能明白. 解法:考虑将这棵树摆直如下: 那么我们可以把 ...

  5. ZOJ 3820 Building Fire Stations

    题意: 树上找两个点  使得其它点到这两点随意一点的距离的最大值最小 思路: 最大值最小  想到二分  在二分的基础上判定这个最大值是否可能 怎样判定这个问题就是怎样选那两个点的问题  非常明显  我 ...

  6. zoj 3820 Building Fire Stations(树上乱搞)

    做同步赛的时候想偏了,状态总是时好时坏.这状态去区域赛果断得GG了. 题目大意:给一棵树.让求出树上两个点,使得别的点到两个点较近的点的距离最大值最小. 赛后用O(n)的算法搞了搞,事实上这道题不算难 ...

  7. ZOJ 3820:Building Fire Stations(树的直径 Grade C)

    题意: n个点的树,边长全为1,求找出两个点,使得树上离这两个点距离最远的那个点,到这两个点(中某个点就行)的距离最小. 思路: 求树直径,找中点,删除中间那条边(如果直径上点数为奇数,则删任何一侧都 ...

  8. ZOJ Problem Set - 3820 Building Fire Stations 【树的直径 + 操作 】

    题目:problemId=5374" target="_blank">ZOJ Problem Set - 3820 Building Fire Stations 题 ...

  9. Building Fire Stations ZOJ - 3820 (二分,树的直径)

    大意: 给定树, 求两个点, 使得所有其他的点到两点的最短距离的最大值尽量小. 二分答案转为判定选两个点, 向外遍历$x$的距离是否能遍历完整棵树. 取直径两段距离$x$的位置bfs即可. #incl ...

随机推荐

  1. 微信小程序导航:官方工具+精品教程+DEMO集合(1月7更新)

    1:官方工具:https://mp.weixin.qq.com/debug/w ... tml?t=14764346784612:简易教程:https://mp.weixin.qq.com/debug ...

  2. linux终端实现代理

    ubuntu 14.04安装Shadowsocks-Qt5 sudo add-apt-repository ppa:hzwhuang/ss-qt5 sudo apt-get update sudo a ...

  3. html5 历史管理onhashchange和state

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. Windows10系统如何更改程序的默认安装目录?

    Windows10系统如何更改程序的默认安装目录? 在Windows10系统的使用中,软件程序的默认安装目录是:C:\Program Files\...或者C:\Program Files(x86)\ ...

  5. 解除sql server数据库占用

    use master go ) set @dbName='dbname' --数据库名 ) declare cur_lock cursor for SELECT DISTINCT request_se ...

  6. Python之str()与repr()的区别

    Python之str()与repr()的区别 str()一般是将数值转成字符串,主要面向用户.  repr()是将一个对象转成字符串显示,注意只是显示用,有些对象转成字符串没有直接的意思.如list, ...

  7. CentOS下采用Crontab实现PHP脚本定时任务

    简单实现一个需求,每5分钟往特定表中插入2条数据.经过分析还是采用crontab方式靠谱,另外执行php脚本的方式,不用担心链接超时等问题. 1.准备工作,创建1个数据表“person”, CREAT ...

  8. ajax提交form表单

    1. ajax提交form表单和不同的form表单的提交主要区别在于,ajax提交表单是异步提交的,而普通的是同步提交的表单. 2. from视图部分 <form id="loginF ...

  9. 破解myEclipse

    建立一个java项目,将reg.java放入,并且运行在控制台 输入账户 回车就会出现 序列号 菜单栏--->myeclipse-->substription information--- ...

  10. java写RelativeLayout 的属性

    有时项目需要动态的调整一下布局,需要改变一些view的位置属性等等. 直接下代码 RelativeLayout.LayoutParams params=new RelativeLayout.Layou ...