ZOJ-3820 Building Fire Stations 题解
题目大意:
一棵树,在其中找两个点,使得其他点到这两个的距离的较小值的最大值的最小值及其方案。
思路:
首先显然一棵树的直径的中点到其他点的距离的最大值必定比其他点的小。
那么感性思考一下就将一棵树的直径平分成两段,在找分成的两棵树的直径的中点。
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 题解的更多相关文章
- zoj 3820 Building Fire Stations(二分法+bfs)
题目链接:zoj 3820 Building Fire Stations 题目大意:给定一棵树.选取两个建立加油站,问说全部点距离加油站距离的最大值的最小值是多少,而且随意输出一种建立加油站的方式. ...
- zoj 3820 Building Fire Stations 树的中心
Building Fire Stations Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.zju.edu.cn/onlinejudge ...
- zoj 3820 Building Fire Stations (二分+树的直径)
Building Fire Stations Time Limit: 5 Seconds Memory Limit: 131072 KB Special Judge Marjar ...
- ZOJ 3820 Building Fire Stations 求中点+树的直径+BFS
题意:给一棵树,要求找出两个点,使得所有点到这两个点中距离与自己较近的一个点的距离的最大值(所有点的结果取最大的值,即最远距离)最小. 意思应该都能明白. 解法:考虑将这棵树摆直如下: 那么我们可以把 ...
- ZOJ 3820 Building Fire Stations
题意: 树上找两个点 使得其它点到这两点随意一点的距离的最大值最小 思路: 最大值最小 想到二分 在二分的基础上判定这个最大值是否可能 怎样判定这个问题就是怎样选那两个点的问题 非常明显 我 ...
- zoj 3820 Building Fire Stations(树上乱搞)
做同步赛的时候想偏了,状态总是时好时坏.这状态去区域赛果断得GG了. 题目大意:给一棵树.让求出树上两个点,使得别的点到两个点较近的点的距离最大值最小. 赛后用O(n)的算法搞了搞,事实上这道题不算难 ...
- ZOJ 3820:Building Fire Stations(树的直径 Grade C)
题意: n个点的树,边长全为1,求找出两个点,使得树上离这两个点距离最远的那个点,到这两个点(中某个点就行)的距离最小. 思路: 求树直径,找中点,删除中间那条边(如果直径上点数为奇数,则删任何一侧都 ...
- ZOJ Problem Set - 3820 Building Fire Stations 【树的直径 + 操作 】
题目:problemId=5374" target="_blank">ZOJ Problem Set - 3820 Building Fire Stations 题 ...
- Building Fire Stations ZOJ - 3820 (二分,树的直径)
大意: 给定树, 求两个点, 使得所有其他的点到两点的最短距离的最大值尽量小. 二分答案转为判定选两个点, 向外遍历$x$的距离是否能遍历完整棵树. 取直径两段距离$x$的位置bfs即可. #incl ...
随机推荐
- HDU 1690 Bus System
题目大意:给出若干巴士不同价格的票的乘坐距离范围,现在有N个站点,有M次询问,查询任意两个站点的最小花费 解析:由于是多次查询不同站点的最小花费,所以用弗洛伊德求解 时间复杂度(O^3) 比较基础的弗 ...
- 渐进式框架、自底向上增量开发的vue
官网对vue.js的介绍是这样的: 一套构建用户界面的 渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计. 那么到底什么是渐进式框架.自底向上增量开发又是什么呢? 其实我觉得这 ...
- css text-overflow:ellipsis 文字多余剪切
text-overflow: ellipsis;多度剪切white-space: nowrap;禁止换行overflow: hidden;多余隐藏
- spring框架学习(三)
一.Spring自动组件扫描 Spring 提供组件扫描(component scanning)功能.它能从指定的classpath里自动扫描.侦测和实例化具有特定注解的组件. 基本的注解是@Comp ...
- Struts开发包结构
- try catch里面try catch嵌套
try catch里能否内嵌try catch?答案是肯定的.但是等内层try catch出异常之后是个什么执行顺序呢?看下面代码 static void Main(string[] args) { ...
- USB_HID读写上位机VC++
在工程属性-->链接器-->添加以下库 open 打开,close 关闭,打开后将获得reader 与writer 的handle,分别进行读写即可 #pragma once #ifdef ...
- debian8安装Odoo中的Barcode Scanner Hardware Driver模块时,提示没有evdev
解决方法: $ apt-get install python-dev python-pip gcc $ apt-get install linux-headers-$(uname -r) $ sudo ...
- KNN识别图像上的数字及python实现
领导让我每天手工录入BI系统中的数据并判断数据是否存在异常,若有异常点,则检测是系统问题还是业务问题.为了解放双手,我决定写个程序完成每天录入管理驾驶舱数据的任务.首先用按键精灵录了一套脚本把系统中的 ...
- 【DWR系列02】-DWR逆向Ajax即服务器推送
.literal { background-color: #f2f2f2; border: 1px solid #cccccc; padding: 1px 3px 0; white-space: no ...