题目:

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

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

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

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

AC代码:

  1. #include <cstdio>
  2. #include <iostream>
  3. #include <algorithm>
  4. #include <vector>
  5. #include <cstring>
  6. #include <queue>
  7. using namespace std;
  8. const int N = 204000;
  9. int n;
  10. vector<int> v[N];
  11. int vis[N],father[N];
  12. vector<int> line;
  13. int BFS(int s,int flag)
  14. {
  15. queue<int> q;
  16. int e=s;
  17. line.clear();
  18. memset(vis,0,sizeof(vis));
  19. memset(father,-1,sizeof(father));
  20. vis[flag]=1;
  21. q.push(s);
  22. vis[s]=1;
  23. int ans=1;
  24. while(!q.empty())
  25. {
  26. int f=q.front();
  27. q.pop();
  28. for(int i=0; i<v[f].size(); i++){
  29. int k=v[f][i];
  30. if(vis[k])
  31. continue;
  32. vis[k]=vis[f]+1;
  33. father[k]=f;
  34. if(vis[k]>ans){
  35. e=k;
  36. ans=vis[k];
  37. }
  38. q.push(k);
  39. }
  40. }
  41. for(int i=e;i!=-1;i=father[i])
  42. line.push_back(i);
  43. return e;
  44. }
  45. struct Node
  46. {
  47. int one,two,ans;
  48. };
  49. void print() //输出
  50. {
  51. for(int i = 0;i<line.size();i++)
  52. {
  53. printf("x%d ",line[i]);
  54. }
  55. printf("\n");
  56. }
  57. pair<int,int> Yougth(int s,int t)
  58. {
  59. int p1 = BFS(s,t);
  60. int p2 = BFS(p1,t);
  61. int len = line.size();
  62. int one = line[len/2];
  63. int tmp = len/2;
  64. pair<int,int> ans(one,tmp);
  65. return ans;
  66. }
  67. Node Importent(int fir,int sec)
  68. {
  69. Node pps;
  70. int ans = -1;
  71. pair<int,int> tt = Yougth(fir,sec);
  72. pps.one = tt.first;
  73. ans = max(ans,tt.second);
  74. tt = Yougth(sec,fir);
  75. pps.two = tt.first;
  76. ans = max(ans , tt.second);
  77. pps.ans = ans;
  78. return pps;
  79. }
  80. void solve()
  81. {
  82. Node pps,ans2;
  83. int p1 = BFS(1,n+1);
  84. int p2 = BFS(p1,n+1);
  85. int len = line.size()/2;
  86. int a = line[len-1],b = line[len] , c = line[len+1];
  87. if(line.size()%2==0)
  88. {
  89. pps = Importent(a,b);
  90. }
  91. else
  92. {
  93. pps = Importent(a,b);
  94. ans2 = Importent(b,c);
  95. if(ans2.ans<pps.ans) //取小的。可是好像没有这种数据
  96. pps = ans2;
  97. }
  98. printf("%d %d %d\n",pps.ans,pps.one,pps.two);
  99. }
  100. int main()
  101. {
  102. int T;
  103. scanf("%d",&T);
  104. while(T--)
  105. {
  106. scanf("%d",&n);
  107. for(int i=0;i<n-1;i++)
  108. {
  109. int x,y;
  110. scanf("%d%d",&x,&y);
  111. v[x].push_back(y);
  112. v[y].push_back(x);
  113. }
  114. solve();
  115. for(int i=0;i<=n;i++)
  116. v[i].clear();
  117. }
  118. return 0;
  119. }

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. Java设计模式透析之 —— 模板方法(Template Method)

    今天你还是像往常一样来上班,一如既往地開始了你的编程工作. 项目经理告诉你,今天想在server端添加一个新功能.希望写一个方法.能对Book对象进行处理.将Book对象的全部字段以XML格式进行包装 ...

  2. tensorflow利用预训练模型进行目标检测(三):将检测结果存入mysql数据库

    mysql版本:5.7 : 数据库:rdshare:表captain_america3_sd用来记录某帧是否被检测.表captain_america3_d用来记录检测到的数据. python模块,包部 ...

  3. Linux就该这么学 20181007(第十一章ftp)

    参考链接https://www.linuxprobe.com/ iptables -F #ftp 21端口 #主动模式,被动模式 #匿名用户 本地用户 虚拟用户 vim /etc/vsftpd/vsf ...

  4. node-express项目的搭建并通过mongoose操作MongoDB实现增删改查分页排序(四)

    最近写了一个用node来操作MongoDB完成增.删.改.查.排序.分页功能的示例,并且已经放在了服务器上地址:http://39.105.32.180:3333. Mongoose是在node.js ...

  5. 移动端 | Vue.js对比微信小程序基础语法

    (1)vue 自定义组件与父组件的通信,props:[abb],可以看成自组建的一个自定义属性 (2)vue 模版语法{{}} 只能是在DOM中插入,<div>{{acc}}</di ...

  6. 微信小程序-最新获取用户基本信息方案

    如果只是单纯的展示用户信息,那么最简单的方案就是 文档中组件: <open-data type="groupName" open-gid="xxxxxx" ...

  7. Java之NoSuchMethodError

    Java之NoSuchMethodError 最近生产环境出现的一个问题,NoSuchMethodError,之前遇到过,大概明白就是方法冲突.这里总结一下,以备学习之用. 错误代码如下: 2018- ...

  8. 利用PBFunc在Powerbuilder中进行FTP操作

    PBFunc.dll包含了FTP的操作,使用FTP时主要需要以下步骤: 1.调用of_Login函数登录Ftp服务器 2.调用FTP的各种方法 3.Ftp操作完毕后调用of_LoginOut方法进行注 ...

  9. vue <router-view>没有渲染

    将routes中的components换成component

  10. 理解UIView的绘制-孙亚洲

    前言 最近研究OpenGL ES相关和 GPU 相关 发现这篇文章很具有参考的入门价值. 理解 UIView 的绘制, UIView 是如何显示到 Screen 上的? 首先要从Runloop开始说, ...