zoj3820 树的直径+二分
这题是个遗憾 !!!!!当时一直不敢相信两个站一定在直径上,赛后想想自己真的是脑袋抽风, 如果其中一个站不在直径上就反向的说明了这条不是直径。可以很明白我们可以肯定的是有一个点一定在直径上假如另外一个点不在直径上,那么他在分支上,那么可以知道直径上的某点一定大于这个分支的最远点,显然放在这个分支上是不合适的。好现在我们知道了者两个点一定在直径上,二分可能最小的距离,
求直径 先从一个点 bfs到离他最远的点a ,然后从a bfs 到离他 最远的点b ,然后 记录路径,就得到了 ab为直径上的树,那么现在将每个直径上的点进行bfs得到了算以他为根的分支最远点(不算直径),然后每次二分后,从直径的两段朝中间走,知道走到二分的答案,然后判断可不可行, 我i好渣,当时脑袋真的被抽风了!
#include <iostream>
#include <cstdio>
#include <string.h>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
const int maxn = ;
vector<int> F[maxn],rdio;
int n;
int per[maxn],dist[maxn];
bool use[maxn];
int bfs(int s,int &ma){
ma=-;
queue<int> Q;
use[s]=true;
int loc;
dist[s]=;
per[s]=-;
Q.push(s);
while(!Q.empty()){
int t=Q.front(); Q.pop();
int siz=F[t].size();
if(dist[t]>ma){
ma=dist[t]; loc=t;
}
for(int i=; i<siz ; ++i){
int to = F[t][i];
if(use[to]==true)continue;
dist[to]=dist[t]+;
use[to]=true;
per[to]=t;
Q.push(to);
}
}
return loc;
}
int Len;
int madist[maxn];
bool jud(int dist, int &x, int &y){
x=; y=Len-;
int d1=madist[];
if(d1>dist) return false;
while(true){
if(x+==y) break;
int d = max( d1+,madist[x+]);
if( d > dist ) break ;
d1=d;
x++;
}
d1=madist[y];
if(d1>dist) return false;
while(true){
if(y-==x)break;
int d= max(d1+,madist[y-]);
if(d>dist) break;
d1=d;
y--;
}
for(int i=x+; i<y; ++i){
int d = min(madist[i]+abs(i-x),madist[i]+abs(i-y));
if(d>dist) return false;
}
return true;
}
int main()
{
int cas;
scanf("%d",&cas);
while(cas--){
scanf("%d",&n);
rdio.clear();
for(int i=; i<=n; ++i ) F[i].clear();
for(int i=; i<n; ++i){
int a,b;
scanf("%d%d",&a,&b);
F[a].push_back(b);
F[b].push_back(a);
}
memset(use,false,sizeof(use));
int ttt;
int st=bfs(,ttt);
memset(use,false,sizeof(use));
int ed=bfs(st,ttt);
memset(use,false,sizeof(use));
for(int i = ed; i!=-; i=per[i]){
rdio.push_back(i);
use[i]=true;
}
for(int i=; i<int(rdio.size()) ; ++i)
bfs(rdio[i],madist[i]);
Len=rdio.size();
int L=,R=n;
int x,y,anx,any;
while( L<R ){
int mid=(L+R)/;
if(jud(mid,x,y)==true){
R=mid;
anx=x; any=y;
}
else L=mid+;
}
printf("%d %d %d\n",R,rdio[anx],rdio[any]);
}
return ;
}
zoj3820 树的直径+二分的更多相关文章
- Codeforces 804D Expected diameter of a tree(树的直径 + 二分 + map查询)
题目链接 Expected diameter of a tree 题目意思就是给出一片森林, 若把任意两棵树合并(合并方法为在两个树上各自任选一点然后连一条新的边) 求这棵新的树的树的直径的期望长度. ...
- bzoj 2282 [Sdoi2011]消防(树的直径,二分)
Description 某个国家有n个城市,这n个城市中任意两个都连通且有唯一一条路径,每条连通两个城市的道路的长度为zi(zi<=1000). 这个国家的人对火焰有超越宇宙的热情,所以这个国家 ...
- Building Fire Stations ZOJ - 3820 (二分,树的直径)
大意: 给定树, 求两个点, 使得所有其他的点到两点的最短距离的最大值尽量小. 二分答案转为判定选两个点, 向外遍历$x$的距离是否能遍历完整棵树. 取直径两段距离$x$的位置bfs即可. #incl ...
- [10.12模拟赛] 老大 (二分/树的直径/树形dp)
[10.12模拟赛] 老大 题目描述 因为 OB 今年拿下 4 块金牌,学校赞助扩建劳模办公室为劳模办公室群,为了体现 OI 的特色,办公室群被设计成了树形(n 个点 n − 1 条边的无向连通图), ...
- [Bzoj2282]消防(二分答案+树的直径)
Description 某个国家有n个城市,这n个城市中任意两个都连通且有唯一一条路径,每条连通两个城市的道路的长度为zi(zi<=1000). 这个国家的人对火焰有超越宇宙的热情,所以这个国家 ...
- zoj 3820 Building Fire Stations (二分+树的直径)
Building Fire Stations Time Limit: 5 Seconds Memory Limit: 131072 KB Special Judge Marjar ...
- Forethought Future Cup - Elimination Round C 二分 + 交互(求树的直径)
https://codeforces.com/contest/1146/problem/C 题意 一颗大小为n的树,每次可以询问两个集合,返回两个集合中的点的最大距离,9次询问之内得出树的直径 题解 ...
- 牡丹江.2014B(图论,树的直径)
B - Building Fire Stations Time Limit:5000MS Memory Limit:131072KB 64bit IO Format:%lld & ...
- BZOJ 2282 & 树的直径
SDOI2011的Dayx第2题 题意: 在树中找到一条权值和不超过S的链(为什么是链呢,因为题目中提到“使得路径的两端都是城市”,如果不是链那不就不止两端了吗——怎么这么机智的感觉...),使得不在 ...
随机推荐
- join()函数的用法【python】
转自:http://www.jb51.net/article/63598.htm
- N32903系列的基础知识(1)
N32903U1DN使用ARM926EJ-S内核,其内部集成的JPEG编解码器.CMOS摄像头接口.32通道的声音处理单元(SPU).ADC.DAC等不仅可以满足各种的应用需求,还能减少生产方面的物料 ...
- PyQt4颜色对话框QColorDialog
QColorDialog提供了用于显示颜色的对话框. #!/usr/bin/python # -*- coding: utf-8 -*- import sys from PyQt4 import Qt ...
- 阿里大于短信返回XML
返回异常和成功的两种不同,XML返回直接拿alibaba_aliqin_fc_sms_num_send_response判断节点是否有这个名字 官方API地址: https://api.alidayu ...
- 【Thinkphp5】封装layer弹窗方法
1 官网下载layer 2 引入文件: <!--layer,官网可下载--> <script type="text/javascript" src="/ ...
- sencha touch 入门系列 (三)sencha touch 项目创建
通过上一章节的学习,我们的开发环境已经配置好了,接下来我们开始创建第一个sencha touch的项目,网络上很多sencha touch的教程都是手动搭建项目的, 不过手动搭建的项目缺少一些senc ...
- ios获取设备手持方向——电子罗盘
转:http://book.51cto.com/art/201411/457105.htm 2014-11-15 19:07 张亚飞/崔巍 中国铁道出版社 字号:T | T 综合评级: 想读() 在 ...
- gradle多项目构建及依赖
上项目结构图: idea里面一个project其实相当于eclipse的一个workspace,这样一来就很好理解了,我们新建了两个module,相当于eclipse的两个项目工程 主要看配置:bui ...
- xpath定位方法小结(转载)
1.实例化一个浏览器WebDriver driver = new FirefoxDriver(); 2.driver.get() get传参数到浏览器中 3.常用定位方法webelement XX=d ...
- wap启用宏
vba for wps office是使用wps的时候开启宏需要的VBA安装包,安装好这个插件就可以开启wps的宏功能了,重新打开WPS Excel,可以看到上面的工具栏中宏选项变成可选的就成功了 1 ...