这题是个遗憾 !!!!!当时一直不敢相信两个站一定在直径上,赛后想想自己真的是脑袋抽风, 如果其中一个站不在直径上就反向的说明了这条不是直径。可以很明白我们可以肯定的是有一个点一定在直径上假如另外一个点不在直径上,那么他在分支上,那么可以知道直径上的某点一定大于这个分支的最远点,显然放在这个分支上是不合适的。好现在我们知道了者两个点一定在直径上,二分可能最小的距离,

求直径 先从一个点 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 树的直径+二分的更多相关文章

  1. Codeforces 804D Expected diameter of a tree(树的直径 + 二分 + map查询)

    题目链接 Expected diameter of a tree 题目意思就是给出一片森林, 若把任意两棵树合并(合并方法为在两个树上各自任选一点然后连一条新的边) 求这棵新的树的树的直径的期望长度. ...

  2. bzoj 2282 [Sdoi2011]消防(树的直径,二分)

    Description 某个国家有n个城市,这n个城市中任意两个都连通且有唯一一条路径,每条连通两个城市的道路的长度为zi(zi<=1000). 这个国家的人对火焰有超越宇宙的热情,所以这个国家 ...

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

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

  4. [10.12模拟赛] 老大 (二分/树的直径/树形dp)

    [10.12模拟赛] 老大 题目描述 因为 OB 今年拿下 4 块金牌,学校赞助扩建劳模办公室为劳模办公室群,为了体现 OI 的特色,办公室群被设计成了树形(n 个点 n − 1 条边的无向连通图), ...

  5. [Bzoj2282]消防(二分答案+树的直径)

    Description 某个国家有n个城市,这n个城市中任意两个都连通且有唯一一条路径,每条连通两个城市的道路的长度为zi(zi<=1000). 这个国家的人对火焰有超越宇宙的热情,所以这个国家 ...

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

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

  7. Forethought Future Cup - Elimination Round C 二分 + 交互(求树的直径)

    https://codeforces.com/contest/1146/problem/C 题意 一颗大小为n的树,每次可以询问两个集合,返回两个集合中的点的最大距离,9次询问之内得出树的直径 题解 ...

  8. 牡丹江.2014B(图论,树的直径)

    B - Building Fire Stations Time Limit:5000MS     Memory Limit:131072KB     64bit IO Format:%lld & ...

  9. BZOJ 2282 & 树的直径

    SDOI2011的Dayx第2题 题意: 在树中找到一条权值和不超过S的链(为什么是链呢,因为题目中提到“使得路径的两端都是城市”,如果不是链那不就不止两端了吗——怎么这么机智的感觉...),使得不在 ...

随机推荐

  1. linux安装nagios客户端

    ( 安装到 被监控的机器上)新增用户和组 useradd nagiosgroupadd nagcmd usermod -a -G nagcmd nagios (如果安装中报没有c编译器,就 yum i ...

  2. python 2.0 s12 day5 常用模块介绍

    模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才 ...

  3. docker n2n安装与调试

    docker n2n安装与调试 yum install -y docker docker pull pahud/n2n-docker cd / 10 mkdir data 11 cd data 12 ...

  4. linux的setup命令设置网卡和防火墙等

    以前在centos上配置网卡都是纯命令行,今天发现linux原来还有一个setup那么好用的命令,真是相见恨晚,以后防火墙.网卡.其他网络配置.系统配置(开机启动项)都可用他来完成了

  5. activemq 实战 一

    This chapter covers  Introduction to the use case for each of the book examples  Use of Maven for ...

  6. mysql 安装流程 兼容8.0.0以上版本 解决修改密码规则问题

    背景介绍: 第一次安装mysql服务端,版本8.0.6 遇到了问题:1:不知道流程:2:8.0以上版本密码加密规则修改的解决方案:   1:下载mysql 服务端 https://dev.mysql. ...

  7. highmaps如何自定义 区间的颜色刻度

    https://api.highcharts.com/highmaps/colorAxis.dataClassColor http://jsfiddle.net/gh/get/library/pure ...

  8. mysql查杀会话

    root登陆mysql,查看会话(show processlist\G;): mysql> kill

  9. mysql max_allowed_packet参数值改大后,莫名被还原

    mysql数据库用innodb引擎,mysql max_allowed_packet在my.cnf中值加大后,够一段时间,系统会莫名把这个参数的值改小. innodb_buffer_pool_size ...

  10. MAC电脑里的休眠功能在哪里?

    Windows7和Ubuntu里都有睡眠和休眠功能,睡眠一般是指挂起到内存,电脑停止运行,数据都在内存里,只需要给内存供电,恢复时很快:休眠是指挂起到硬盘,电脑可以完全停止供电,恢复时从硬盘读取数据, ...