题目链接: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. xcode 各种项目设置

    1:语言环境设置:项目–>PROJECT–>info–>Locailzation 2 : 手动加入项目依赖 Build Settings–>Search path–>Li ...

  2. linux 内核源代码目录结构

    /arch:目录包括了所有和体系结构相关的核心代码.它下面的每一个子目录都代表一种Linux支持的体系结构,例如i386就是Intel CPU及与之相兼容体系结构的子目录.PC机一般都基于此目录. / ...

  3. 关于Altium Designer重新修改某一原件pcb封装的问题

    在重新导入的时候可能会影响到类class,所以可能是原理图中没有类吧 上图中的comment的修改是表示下面图片中的 comment栏的改变:

  4. [转载]Surging Demo 项目之一

    开发与运行环境 IDE Visual Stadio 2017/Visual Stadio 2019 Visual Stadio Core Docker 和 Docker-Compose 通过docke ...

  5. VS无法访问IIS元数据库 您没有足够的特权访问计算机上的IIS网站

    进入windows\regedit.exe下的HKEY_CRRENT_USER\Software\Microsoft\Windows\CurrentVersion\Exploer\User Shell ...

  6. js进阶课程 12-9 jquery的事件对象event的方法有哪些?

    js进阶课程 12-9 jquery的事件对象event的方法有哪些? 一.总结 一句话总结:三组六个,阻止默认事件一组,阻止冒泡一组,阻止冒泡和剩余事件一组. 1.事件的默认动作指什么? 比如点a标 ...

  7. swift 旋转加载动画

    https://github.com/naoyashiga/RPLoadingAnimation

  8. 调用另一个Activity 分类: H1_ANDROID 2013-09-22 14:11 2217人阅读 评论(0) 收藏

    参考自Google官方文档Traning/Getting Started/Building a simple user interface, Startinganother activity,http ...

  9. js中单引号和双引号的区别(html中属性规范是用双引号,js中字符串规定是用单引号)(js中单引号区别和php很像:单引号快,双引号可转义字符,双引号可解析变量)

    js中单引号和双引号的区别(html中属性规范是用双引号,js中字符串规定是用单引号)(js中单引号区别和php很像:单引号快,双引号可转义字符,双引号可解析变量) 一.总结 1.html中属性规范是 ...

  10. mysqldump 不需要密码

    -p 参数比较特殊,正确语法是 -ppassword,即-p和密码中间不能有空格. 请教:数据库备份命令如果这样写mysqldump -u root -p dataname>/home/data ...