题目链接:zoj 3820 Building Fire Stations

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

解题思路:二分距离推断,推断函数的复杂度是o(n),这种复杂度应该是o(nlogn)。即使常数系数偏大,可是竟然跑了4.5s,也是醉了。

推断函数里面做了3次bfs,可是每次bfs节点最多遍历1次,首先任取一点做根建立一个树,找到深度最大的节点。以向上移动L(推断的ans)位置处的节点建立加油站,并以该点为根在建一棵树,这是第2次bfs,然后相同以最深的节点向上移动L次的节点建立加油站,推断这两个加油站使得全部节点距离加油站的值是否均小于等于L。

#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm> using namespace std; const int maxn = 200005;
const int INF = 0x3f3f3f3f; int M, first[maxn], jump[maxn * 2], edge[maxn * 2];
int N, s, e, far[maxn], dis[maxn];
queue<int> que; inline void add_edge(int u, int v) {
edge[M] = v;
jump[M] = first[u];
first[u] = M++;
} void init () {
int l, r;
M = 0;
scanf("%d", &N);
memset(first, -1, sizeof(first));
for (int i = 1; i < N; i++) {
scanf("%d%d", &l, &r);
add_edge(l, r);
add_edge(r, l);
}
} int bfs(int s) {
que.push(s);
dis[s] = far[s] = 0; int u;
while (!que.empty()) {
u = que.front();
que.pop(); for (int i = first[u]; i + 1; i = jump[i]) {
int v = edge[i];
if (dis[v] > dis[u] + 1) {
far[v] = u;
dis[v] = dis[u] + 1;
que.push(v);
}
}
}
return u;
} bool judge (int L) {
memset(dis, INF, sizeof(dis));
s = bfs(1);
for (int i = 0; i < L; i++) {
s = far[s];
if (far[s] == 0) {
e = s % N + 1;
return true;
}
} memset(dis, INF, sizeof(dis));
e = bfs(s);
for (int i = 0; i < L; i++) {
if (far[e] == 0)
return true;
e = far[e];
} if (e == s)
e = e % N + 1;
bfs(e);
for (int i = 1; i <= N; i++)
if (dis[i] > L)
return false;
return true;
} void solve () {
if (N == 2) {
printf("0 1 2\n");
return ;
} int l = 0, r = N;
while (l < r) {
int mid = (l + r) / 2;
if (judge(mid))
r = mid;
else
l = mid + 1;
}
judge(l);
printf("%d %d %d\n", l, s, e);
} int main () {
int cas;
scanf("%d", &cas);
while (cas--) {
init();
solve();
}
return 0;
}

版权声明:本文博主原创文章,博客,未经同意不得转载。

zoj 3820 Building Fire Stations(二分法+bfs)的更多相关文章

  1. zoj 3820 Building Fire Stations 树的中心

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

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

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

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

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

  4. ZOJ 3820 Building Fire Stations

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

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

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

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

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

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

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

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

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

  9. ZOJ-3820 Building Fire Stations 题解

    题目大意: 一棵树,在其中找两个点,使得其他点到这两个的距离的较小值的最大值的最小值及其方案. 思路: 首先显然一棵树的直径的中点到其他点的距离的最大值必定比其他点的小. 那么感性思考一下就将一棵树的 ...

随机推荐

  1. 26、驱动调试之根据oops信息和堆栈确定出错的代码

    a.驱动作为模块:1. 根据pc值确定该指令属于内核还是外加的模块pc=0xbf000018 它属于什么的地址?是内核还是通过insmod加载的驱动程序?先判断是否属于内核的地址: 看System.m ...

  2. php面试题5

    php面试题5 一.总结 二.php面试题5 1. 什么事面向对象?主要特征是什么?1) 面向对象是程序的一种设计方式,它利于提高程序的重用性,是程序结构更加清晰.2) 主要特征:封装.继承.多态 2 ...

  3. [Recompose] Replace a Component with Non-Optimal States using Recompose

    Learn how to use the ‘branch’ and ‘renderComponent’ higher-order components to show errors or messag ...

  4. iOS开发RunLoop学习:三:Runloop相关类(source和Observer)

    一:RunLoop相关类: 其中:source0指的是非基于端口por,说白了也就是处理触摸事件,selector事件,source1指的是基于端口的port:是处理系统的一些事件 注意:创建一个Ru ...

  5. CreateFeature与CreateFeatureBuffer区别

    转自原文CreateFeature与CreateFeatureBuffer区别 CreateFeature主要用于插入一条数据,CreateFeatureBuffer住哟啊用于插入多条数据,详细说明见 ...

  6. 小强的HTML5移动开发之路(46)——汇率计算器【2】

    在上一篇中我们完成了汇率计算页面,下面来完成汇率设置页面的显示. <div class="setRates"> <div class="header&q ...

  7. Android接口安全 - RSA+AES混合加密方案

    转载请注明出处: http://blog.csdn.net/aa464971/article/details/51034462 本文以Androidclient加密提交数据到Java服务端后进行解密为 ...

  8. C# WebQQ协议群发机器人(一)

    原创性申明 本文地址 http://blog.csdn.net/zhujunxxxxx/article/details/38931287 转载的话请注明出处. 之前我也写过一篇使用python来实现的 ...

  9. js如何实现动态的在表格中添加和删除行?(两种方法)

    js如何实现动态的在表格中添加和删除行?(两种方法) 一.总结 1.table元素有属性和一些方法(js使用) 方法一:添加可通过在table的innerHTML属性中添加tr和td来实现 tab.i ...

  10. PHP移动互联网开发笔记(7)——MySQL数据库基础回顾[1]

    一.数据类型 1.整型 数据类型 存储空间 说明 取值范围 TINYINT 1字节 非常小的整数 带符号值:-128~127无符号值:0~255 SMALLINT 2字节 较小的整数 带符号值:-32 ...