题目地址

因为最后要看的是到所有路线上的区域最大距离最小的中心点,所以可以采取遍历路线上所有的区域,对每个区域进行BFS的办法。为了更方便的在每一次BFS都遍历所有的区域,可以加一个reach数组,记录每个区域被第几站BFS过,进行过一次就将站数赋给reach。BFS时的“距离”类似于”“等距线”,一圈圈的往外面走。

  1. #include <cstdio>
  2. #include <queue>
  3. #include<cstring>
  4. #define ZMAX 10000//定义整个地区编号的最大值
  5. #define INF 100000
  6. using namespace std;
  7. int nz,nr;//number of zones地区数,number of routes路线数
  8. int mz[ZMAX];//存储第i个区域相邻的区域数
  9. int Edge[ZMAX][];//第i个区域相邻的区域的编号
  10. int res[ZMAX];//该区域到所有路线上的区域的距离的最小值
  11. int cur;//“第几站”,用以界定路线上的区域,每次刷新其他区域的res的值
  12. int reach[ZMAX];//记录某个区域res已经刷新到了路线上第几个区域,e.g. reach[s]==cur 表示地区s在第cur+1站已访问
  13. int max(int x,int y)
  14. {
  15. return (x>y)?x:y;
  16. }
  17. void BFS(int s)//从区域s出发的BFS遍历
  18. {
  19. int i,a,b;
  20. int val,at;//val记录层(圈)数(即“等距线”的第几层,或者说是距离),at表示当前节点
  21. queue<int> q[];//滚动队列
  22. a=,b=,val=;
  23. if(reach[s]<cur)//这种情况表示这一站还没刷新过s这个位置
  24. {
  25. q[b].push(s);
  26. reach[s]=cur;
  27. res[s]=max(res[s],val+);//层数是需要+1的,这样才为需要的值
  28. }
  29. while(!q[b].empty())
  30. {
  31. swap(a,b);//开始交换a、b,滚动
  32. val++;//层数+1,因为之前那层的已经全部放入队列中
  33. while(!q[a].empty())
  34. {
  35. at=q[a].front();
  36. q[a].pop();
  37. for(i=;i<mz[at];i++)
  38. {
  39. if(reach[Edge[at][i]]<cur)//看这个的临近区域,未刷新就放入队列
  40. {
  41. q[b].push(Edge[at][i]);
  42. reach[Edge[at][i]]=cur;
  43. res[Edge[at][i]]=max(res[Edge[at][i]],val+);//进行刷新
  44. }
  45. }
  46. }
  47. }
  48. }
  49. int main()
  50. {
  51. int T;
  52. int i,j,t;
  53. int id;
  54. int mr;//公交线路途径区域数
  55. int ret,center;//记录最小星形阈值和中心地区编号
  56. scanf("%d",&T);
  57. for(t=;t<T;t++)
  58. {
  59. memset(reach,-,sizeof(reach));//reach要初始化为1,因为cur初始为0
  60. memset(res,,sizeof(res));
  61. cur=;
  62. scanf("%d%d",&nz,&nr);
  63. for(i=;i<nz;i++)
  64. {
  65. scanf("%d",&id);
  66. scanf("%d",&mz[id]);
  67. for(j=;j<mz[id];j++)
  68. scanf("%d",&Edge[id][j]);
  69. }
  70. for(i=;i<nr;i++)
  71. {
  72. scanf("%d",&mr);
  73. for(j=;j<mr;j++)
  74. {
  75. scanf("%d",&id);
  76. BFS(id);//对公交线路上的每个区域分别进行DFS,刷新其他所有区域的res
  77. cur++;//下一站
  78. }
  79. }
  80. ret=,center=-;
  81. for(i=;i<;i++)
  82. {
  83. if(reach[i]==cur-&&res[i]<ret)//第一条判断是否经过了最后一次的刷新
  84. {
  85. ret=res[i];
  86. center=i;
  87. }
  88. }
  89. printf("%d %d\n",ret,center);
  90. }
  91. return ;
  92. }

(BFS)hdoj2377-Bus Pass的更多相关文章

  1. 深搜(DFS)广搜(BFS)详解

    图的深搜与广搜 一.介绍: p { margin-bottom: 0.25cm; direction: ltr; line-height: 120%; text-align: justify; orp ...

  2. 【算法导论】图的广度优先搜索遍历(BFS)

    图的存储方法:邻接矩阵.邻接表 例如:有一个图如下所示(该图也作为程序的实例): 则上图用邻接矩阵可以表示为: 用邻接表可以表示如下: 邻接矩阵可以很容易的用二维数组表示,下面主要看看怎样构成邻接表: ...

  3. 深度优先搜索(DFS)与广度优先搜索(BFS)的Java实现

    1.基础部分 在图中实现最基本的操作之一就是搜索从一个指定顶点可以到达哪些顶点,比如从武汉出发的高铁可以到达哪些城市,一些城市可以直达,一些城市不能直达.现在有一份全国高铁模拟图,要从某个城市(顶点) ...

  4. 【BZOJ5492】[HNOI2019]校园旅行(bfs)

    [HNOI2019]校园旅行(bfs) 题面 洛谷 题解 首先考虑暴力做法怎么做. 把所有可行的二元组全部丢进队列里,每次两个点分别向两侧拓展一个同色点,然后更新可行的情况. 这样子的复杂度是\(O( ...

  5. 深度优先搜索(DFS)和广度优先搜索(BFS)

    深度优先搜索(DFS) 广度优先搜索(BFS) 1.介绍 广度优先搜索(BFS)是图的另一种遍历方式,与DFS相对,是以广度优先进行搜索.简言之就是先访问图的顶点,然后广度优先访问其邻接点,然后再依次 ...

  6. 图的 储存 深度优先(DFS)广度优先(BFS)遍历

    图遍历的概念: 从图中某顶点出发访遍图中每个顶点,且每个顶点仅访问一次,此过程称为图的遍历(Traversing Graph).图的遍历算法是求解图的连通性问题.拓扑排序和求关键路径等算法的基础.图的 ...

  7. 数据结构与算法之PHP用邻接表、邻接矩阵实现图的广度优先遍历(BFS)

    一.基本思想 1)从图中的某个顶点V出发访问并记录: 2)依次访问V的所有邻接顶点: 3)分别从这些邻接点出发,依次访问它们的未被访问过的邻接点,直到图中所有已被访问过的顶点的邻接点都被访问到. 4) ...

  8. 层层递进——宽度优先搜索(BFS)

    问题引入 我们接着上次“解救小哈”的问题继续探索,不过这次是用宽度优先搜索(BFS). 注:问题来源可以点击这里 http://www.cnblogs.com/OctoptusLian/p/74296 ...

  9. HDU.2612 Find a way (BFS)

    HDU.2612 Find a way (BFS) 题意分析 圣诞节要到了,坤神和瑞瑞这对基佬想一起去召唤师大峡谷开开车.百度地图一下,发现周围的召唤师大峡谷还不少,这对基佬纠结着,该去哪一个...坤 ...

  10. POJ.1426 Find The Multiple (BFS)

    POJ.1426 Find The Multiple (BFS) 题意分析 给出一个数字n,求出一个由01组成的十进制数,并且是n的倍数. 思路就是从1开始,枚举下一位,因为下一位只能是0或1,故这个 ...

随机推荐

  1. (一)SecureCRT连接虚拟机linux

    最近在学习linux,在使用SecureCRT连接虚拟机linux时遇到了一些问题,现在总结一下. 1.首先要配置linux配置文件,修改静态IP地址以及掩码,保持与本地在同一网段.更改配置文件方法如 ...

  2. 5.2 i++

    答案:第一段21,第二段12 PS:注意运算符的优先级. 答案:A

  3. iOS开发之 获取手机的网络的ip地址

    首先在使用的地方导入 #include <ifaddrs.h> #include <arpa/inet.h> 然后直接调用 - (NSString *)getIPAddress ...

  4. iOS——为Xcode编译POCO C++静态库

    一.POCO C++ library简介 POCO C++ library是一个C++编写的跨平台库,主要实现网络连接.数据库管理以及服务器,适用于跨平台.嵌入式. 二.为Xcode编译POCO C+ ...

  5. [html] 前端角度出发做好SEO需要考虑什么

    Meta标签优化 主要包括主题(Title),网站描述(Description),和关键词(Keywords).还有一些其它的隐藏文字比如Author(作者),Category(目录),Languag ...

  6. 合并Excel文件

    //合并Excel文件 private void MargeExcelFile(string destFile, string dirPath) { DirectoryInfo dir = new D ...

  7. VIm vi 使用 汇总

    x 删除当前光标下的字符dw 删除光标之后的单词剩余部分.d$ 删除光标之后的该行剩余部分.dd 删除当前行. c 功能和d相同,区别在于完成删除操作后进入INSERT MODEcc 也是删除当前行, ...

  8. [转载]java中try 与catch的使用

    留着以后看 原文地址:与catch的使用">java中try 与catch的使用作者:碌碌如玉 try{ //代码区 }catch(Exception e){ //异常处理 } 代码区 ...

  9. 你必须知道的28个HTML5特征、窍门和技术

    注意:每周有那么几次,此列表会更新一些新的窍门,最终,本文会成为超级有用的资源.//zxx:丑话说在前头,我可没功夫更新,所以,即使到您女儿出嫁那天,本文还是28项内容 前端的发展如此之迅猛,一不留神 ...

  10. C# EXCEL(.xls和.xlsx)导入到数据库

    C# EXCEL(.xls和.xlsx)导入到数据库  转(http://www.cnblogs.com/bart-cai/articles/2716555.html) 原理:1.判断是否是Excel ...