题目地址

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

 #include <cstdio>
#include <queue>
#include<cstring>
#define ZMAX 10000//定义整个地区编号的最大值
#define INF 100000
using namespace std;
int nz,nr;//number of zones地区数,number of routes路线数
int mz[ZMAX];//存储第i个区域相邻的区域数
int Edge[ZMAX][];//第i个区域相邻的区域的编号
int res[ZMAX];//该区域到所有路线上的区域的距离的最小值
int cur;//“第几站”,用以界定路线上的区域,每次刷新其他区域的res的值
int reach[ZMAX];//记录某个区域res已经刷新到了路线上第几个区域,e.g. reach[s]==cur 表示地区s在第cur+1站已访问
int max(int x,int y)
{
return (x>y)?x:y;
}
void BFS(int s)//从区域s出发的BFS遍历
{
int i,a,b;
int val,at;//val记录层(圈)数(即“等距线”的第几层,或者说是距离),at表示当前节点
queue<int> q[];//滚动队列
a=,b=,val=;
if(reach[s]<cur)//这种情况表示这一站还没刷新过s这个位置
{
q[b].push(s);
reach[s]=cur;
res[s]=max(res[s],val+);//层数是需要+1的,这样才为需要的值
}
while(!q[b].empty())
{
swap(a,b);//开始交换a、b,滚动
val++;//层数+1,因为之前那层的已经全部放入队列中
while(!q[a].empty())
{
at=q[a].front();
q[a].pop();
for(i=;i<mz[at];i++)
{
if(reach[Edge[at][i]]<cur)//看这个的临近区域,未刷新就放入队列
{
q[b].push(Edge[at][i]);
reach[Edge[at][i]]=cur;
res[Edge[at][i]]=max(res[Edge[at][i]],val+);//进行刷新
}
}
}
}
}
int main()
{
int T;
int i,j,t;
int id;
int mr;//公交线路途径区域数
int ret,center;//记录最小星形阈值和中心地区编号
scanf("%d",&T);
for(t=;t<T;t++)
{
memset(reach,-,sizeof(reach));//reach要初始化为1,因为cur初始为0
memset(res,,sizeof(res));
cur=;
scanf("%d%d",&nz,&nr);
for(i=;i<nz;i++)
{
scanf("%d",&id);
scanf("%d",&mz[id]);
for(j=;j<mz[id];j++)
scanf("%d",&Edge[id][j]);
}
for(i=;i<nr;i++)
{
scanf("%d",&mr);
for(j=;j<mr;j++)
{
scanf("%d",&id);
BFS(id);//对公交线路上的每个区域分别进行DFS,刷新其他所有区域的res
cur++;//下一站
}
}
ret=,center=-;
for(i=;i<;i++)
{
if(reach[i]==cur-&&res[i]<ret)//第一条判断是否经过了最后一次的刷新
{
ret=res[i];
center=i;
}
}
printf("%d %d\n",ret,center);
}
return ;
}

(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. C 语言预处理

    在嵌入式系统编程中,不管是内核的驱动程序还是应用程序的编写,都涉及到大量的预处理与条件编译,这样做的好处主要体现在代码的移植性强以及代码的修改方便等特性,因此引入了预处理与条件编译的概念.在C语言的程 ...

  2. Android Glide+CircleImageView实现加载圆形图片列表

    需求:要在列表中实现圆形图片的显示,控件可能和加载库会存在冲突 先上代码,至于其中源码,以后有空再分析 MainActivity public class MainActivity extends A ...

  3. iOS 开发之 Xcode6 打包生成ipa给测试

    Xcode 6正式版Version 6.0.1 (6A317)已经放出Mac AppStore,之前为了体验swift也安装过beta版,但是并没有注意到6系Xcode对于导出ipa的变化,更新正式版 ...

  4. POCO C++库学习和分析——任务

    1.任务的定义 任务虽然在Poco::Foundation库的目录中被单独划出来,其实可以被看成线程的应用,放在线程章节.首先来看一下Poco中对任务的描述: *task主要应用在GUI和Sever程 ...

  5. 转:为什么C++中空类和空结构体大小为1?

    参考:http://www.spongeliu.com/260.html 为什么C++中空类和空结构体大小为1? On November 17, 2010, in C语言, 语言学习, by spon ...

  6. 面向对象的static关键字(类中的static关键字)

    转自:http://blog.csdn.net/xiayefanxing/article/details/7382192 http://www.cnblogs.com/SelaSelah/archiv ...

  7. 全局变量报错:UnboundLocalError: local variable 'l' referenced before assignment

    总结: 内部函数,不修改全局变量可以访问全局变量 内部函数,修改同名全局变量,则python会认为它是一个局部变量 在内部函数修改同名全局变量之前调用变量名称(如print sum),则引发Unbou ...

  8. linux特殊字符

    linux特殊字符: * 匹配文件名中的任何字符串,包括空字符串. ? 匹配文件名中的任何单个字符. [...] 匹配[ ]中所包含的任何字符. [!...] 匹配[ ]中非感叹号!之后的字符. 当s ...

  9. Windows 内存架构

    理解 Virtual Memory, Physical Memory, Committed Memory, Page File, Working Set, Modified Pages, Standb ...

  10. dom4j解析xml作为测试数据

    构造函数: public AppTestData(File xmlFile) throws Exception { file = xmlFile; try { saxReader = new SAXR ...