题目:

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. hdu5386 Cover

    Problem Description You have an n∗n matrix.Every grid has a color.Now there are two types of operati ...

  2. n个整数全排列的递归实现(C++)

    全排列是很经常使用的一个小算法,以下是n个整数全排列的递归实现,使用的是C++ #include <iostream> using namespace std; int n = 0; vo ...

  3. String与StringBuffer的差别

    String 是一个常量,即一旦创建不可更改 输出结果为:helloworldjeok 看似.string变量name的值改变了,事实上此name非彼name. 输出结果为: sex:hello wo ...

  4. nodejs免费空间

    https://www.nitrous.io/join/N_aIGoSnOMI node免费空间,可以把自己node 代码部署到云端. 也可以在线编辑,当然也能在外网地址访问到,是自己学习nodejs ...

  5. 切换JDK版本quick

    最近遇到一个小问题,同时做两个项目,jdk版本一个是5,一个是6,我也去网上找了找方法,但是感觉不是特别好用,最后自己通过一些环境变量设置的技巧和一些批处理命令来使得这件事情只需要双击,输入一个数字回 ...

  6. checkbox的使用总结

    1 checkbox如何选中时显示内容,不被选中时隐藏内容 <!DOCTYPE html> <html> <head> <meta name="vi ...

  7. Maven 学习笔记(一)

    定义 Maven 是基于项目对象模型(POM)的软件项目管理工具,它采用纯 java 编写,用于管理项目的构建,最早在 Jakata Turbine 项目中开始被使用.它包含了一个项目对象模型(Pro ...

  8. 日志记录~log4.net

    1. 添加Log4net引用 2. 添加配置文件 Log.config <?xml version="1.0" encoding="utf-8"?> ...

  9. Centos7 minimal 系列之桥接模式联网(二)

    一.桥接模式联网 之前用NAT模式连接网络,Centos是可以上网,而且Centos可以ping通主机,但是主机ping不通虚拟机.后来发现Nat模式只能由内而外. 1.1设置虚拟机的网络适配器 1. ...

  10. ifame子页实现父页面刷新(或跳转到指定页面)

    <script>parent.location.replace('../D_DailyManager/Add.aspx?id=" + x + "');</scri ...