题目:

problemId=5374" target="_blank">ZOJ Problem Set - 3820 Building Fire Stations

题意:给出n个点,n-1条边的一棵树。然后要在两个点上建立两个消防站。让全部点的到消防站最大距离的点的这个距离最小。

分析:首先先求这个树的直径。然后在树的直径的中点处把树分成两棵树。然后在把两棵树分别取中点的最大值就是ans值。

这个题目数据有点水了感觉。。。

AC代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
const int N = 204000;
int n;
vector<int> v[N];
int vis[N],father[N];
vector<int> line;
int BFS(int s,int flag)
{
queue<int> q;
int e=s;
line.clear();
memset(vis,0,sizeof(vis));
memset(father,-1,sizeof(father));
vis[flag]=1;
q.push(s);
vis[s]=1;
int ans=1;
while(!q.empty())
{
int f=q.front();
q.pop();
for(int i=0; i<v[f].size(); i++){
int k=v[f][i];
if(vis[k])
continue;
vis[k]=vis[f]+1;
father[k]=f;
if(vis[k]>ans){
e=k;
ans=vis[k];
}
q.push(k);
}
}
for(int i=e;i!=-1;i=father[i])
line.push_back(i);
return e;
}
struct Node
{
int one,two,ans;
};
void print() //输出
{
for(int i = 0;i<line.size();i++)
{
printf("x%d ",line[i]);
}
printf("\n");
}
pair<int,int> Yougth(int s,int t)
{
int p1 = BFS(s,t);
int p2 = BFS(p1,t);
int len = line.size();
int one = line[len/2];
int tmp = len/2;
pair<int,int> ans(one,tmp);
return ans;
}
Node Importent(int fir,int sec)
{
Node pps;
int ans = -1;
pair<int,int> tt = Yougth(fir,sec);
pps.one = tt.first;
ans = max(ans,tt.second);
tt = Yougth(sec,fir);
pps.two = tt.first;
ans = max(ans , tt.second);
pps.ans = ans;
return pps;
}
void solve()
{
Node pps,ans2;
int p1 = BFS(1,n+1);
int p2 = BFS(p1,n+1);
int len = line.size()/2;
int a = line[len-1],b = line[len] , c = line[len+1];
if(line.size()%2==0)
{
pps = Importent(a,b);
}
else
{
pps = Importent(a,b);
ans2 = Importent(b,c);
if(ans2.ans<pps.ans) //取小的。可是好像没有这种数据
pps = ans2;
}
printf("%d %d %d\n",pps.ans,pps.one,pps.two);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=0;i<n-1;i++)
{
int x,y;
scanf("%d%d",&x,&y);
v[x].push_back(y);
v[y].push_back(x);
}
solve();
for(int i=0;i<=n;i++)
v[i].clear();
}
return 0;
}

ZOJ Problem Set - 3820 Building Fire Stations 【树的直径 + 操作 】的更多相关文章

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

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

  2. zoj 3820 Building Fire Stations 树的中心

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

  3. zoj 3820 Building Fire Stations(二分法+bfs)

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

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

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

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

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

  6. zoj3820 Building Fire Stations 树的中心

    题意:n个点的树,给出n-1条边,每条边长都是1,两个点建立防火站,使得其他点到防火站的最远距离最短. 思路:比赛的时候和队友一开始想是把这两个点拎起来,使得层数最少,有点像是树的中心,于是就猜测是将 ...

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

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

  8. ZOJ 3820 Building Fire Stations

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

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

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

随机推荐

  1. Deming管理系列(1)——开车仅仅看后视镜

    问题: 当业务经理被要求为未来的业务做计划时,他会提出一个自觉得不错的数字,而董事会往往希望能获得更大的收益,多次与其谈判.而业务经理在这方面不是新手,他有非常多可用的报告. 为什么不能让业务规划流程 ...

  2. 关于server和虚拟主机的差别

    文章都是先由本人个人博客,孙占兴:www.teilim.com,先更新,随后CSDN博客才会更新.掌握第一动态请关注本人主站. 原文链接:http://www.teilim.com/guan-yu-y ...

  3. 【Xcode学C-1】怎样用Xcode练习C语言,并练习一个输出样例,以及重要的注意事项

    直接用Xcode学习C语言,为iOS开发打基础. (1)选择OS X >>> Application >>> Command Line Tool (2)输入产品名称 ...

  4. ”危险“的RESTRICT与GCC的编译优化(编程者对编译器所做的一个“承诺”:使用restrict修饰过的指针,它所指向的内容只能经由该指针修改)

    restrict是C99标准中新添加的关键字,对于从C89标准开始起步学习C语言的同学来说(包括我),第一次看到restrict还是相当陌生的.Wikipedia给出的解释如下: In the C p ...

  5. FFMpeg在Windows下搭建开发环境【转】

    本文转载自:http://blog.csdn.net/wootengxjj/article/details/51758621 版权声明:本文为博主原创文章,未经博主允许不得转载. FFmpeg 是一个 ...

  6. sklearn中的数据预处理----good!! 标准化 归一化 在何时使用

    RESCALING attribute data to values to scale the range in [0, 1] or [−1, 1] is useful for the optimiz ...

  7. USACO 1.5 Superprime Rib

    Superprime Rib Butchering Farmer John's cows always yields the best prime rib. You can tell prime ri ...

  8. intelliJ idea运行新的test功能时,报错:class not found "....." empty test suite

    转自:https://blog.csdn.net/u012560212/article/details/75037578

  9. Core Bluetooth的基本常识

    每个蓝牙4.0设备都是通过服务(Service)和特征(Characteristic)来展示自己的 一个设备必然包含一个或多个服务,每个服务下面又包含若干个特征 特征是与外界交互的最小单位 比如说,一 ...

  10. ROS集成开发环境RoboWare Studio安装教程

    前言:很多人说vim是最快的,所以我选择用roboware. ROS 自带的编辑器vim增加插件,效果如下: RoboWare Studio,效果如下: 下面开始安装. 一.安装 去官网 http:/ ...