(BFS)hdoj2377-Bus Pass
因为最后要看的是到所有路线上的区域最大距离最小的中心点,所以可以采取遍历路线上所有的区域,对每个区域进行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的更多相关文章
- 深搜(DFS)广搜(BFS)详解
图的深搜与广搜 一.介绍: p { margin-bottom: 0.25cm; direction: ltr; line-height: 120%; text-align: justify; orp ...
- 【算法导论】图的广度优先搜索遍历(BFS)
图的存储方法:邻接矩阵.邻接表 例如:有一个图如下所示(该图也作为程序的实例): 则上图用邻接矩阵可以表示为: 用邻接表可以表示如下: 邻接矩阵可以很容易的用二维数组表示,下面主要看看怎样构成邻接表: ...
- 深度优先搜索(DFS)与广度优先搜索(BFS)的Java实现
1.基础部分 在图中实现最基本的操作之一就是搜索从一个指定顶点可以到达哪些顶点,比如从武汉出发的高铁可以到达哪些城市,一些城市可以直达,一些城市不能直达.现在有一份全国高铁模拟图,要从某个城市(顶点) ...
- 【BZOJ5492】[HNOI2019]校园旅行(bfs)
[HNOI2019]校园旅行(bfs) 题面 洛谷 题解 首先考虑暴力做法怎么做. 把所有可行的二元组全部丢进队列里,每次两个点分别向两侧拓展一个同色点,然后更新可行的情况. 这样子的复杂度是\(O( ...
- 深度优先搜索(DFS)和广度优先搜索(BFS)
深度优先搜索(DFS) 广度优先搜索(BFS) 1.介绍 广度优先搜索(BFS)是图的另一种遍历方式,与DFS相对,是以广度优先进行搜索.简言之就是先访问图的顶点,然后广度优先访问其邻接点,然后再依次 ...
- 图的 储存 深度优先(DFS)广度优先(BFS)遍历
图遍历的概念: 从图中某顶点出发访遍图中每个顶点,且每个顶点仅访问一次,此过程称为图的遍历(Traversing Graph).图的遍历算法是求解图的连通性问题.拓扑排序和求关键路径等算法的基础.图的 ...
- 数据结构与算法之PHP用邻接表、邻接矩阵实现图的广度优先遍历(BFS)
一.基本思想 1)从图中的某个顶点V出发访问并记录: 2)依次访问V的所有邻接顶点: 3)分别从这些邻接点出发,依次访问它们的未被访问过的邻接点,直到图中所有已被访问过的顶点的邻接点都被访问到. 4) ...
- 层层递进——宽度优先搜索(BFS)
问题引入 我们接着上次“解救小哈”的问题继续探索,不过这次是用宽度优先搜索(BFS). 注:问题来源可以点击这里 http://www.cnblogs.com/OctoptusLian/p/74296 ...
- HDU.2612 Find a way (BFS)
HDU.2612 Find a way (BFS) 题意分析 圣诞节要到了,坤神和瑞瑞这对基佬想一起去召唤师大峡谷开开车.百度地图一下,发现周围的召唤师大峡谷还不少,这对基佬纠结着,该去哪一个...坤 ...
- POJ.1426 Find The Multiple (BFS)
POJ.1426 Find The Multiple (BFS) 题意分析 给出一个数字n,求出一个由01组成的十进制数,并且是n的倍数. 思路就是从1开始,枚举下一位,因为下一位只能是0或1,故这个 ...
随机推荐
- XML 解析器
所有现代浏览器都内建了供读取和操作 XML 的 XML 解析器.解析器把 XML 转换为 XML DOM 对象 - 可通过 JavaScript 操作的对象. 解析 XML 文档为DOM对象 方法一: ...
- hibernate mysql写入中文乱码 解决
启动hibernate项目,自动创建表,插入数据之后发现写入表里的数据里的中文是乱码.按如下方法解决了: 修改数据库的字符集为UTF-8,这个可以通过mysql的客户端软件里右键要修改的数据库的属性更 ...
- Differences between volume, partition and drive
A drive is a physical block disk. For example: /dev/sda. A partition A drive can be divided into som ...
- (转)Thread.setDaemon设置说明
本想搜下python多线程里的setDaemon,发现了这篇文章写得很不错:http://blog.csdn.net/m13666368773/article/details/7245570 Thre ...
- maven install 报错Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project*****
[ERROR]Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-co ...
- MEAN-全栈javascript开发框架
引言 使用JavaScript能够完整迅速做出Web应用程序,目前一套工具包括MongoDB.ExpressJS,AngularJS和Node.js越来越受到欢迎,其开发的灵活性和易用性加快开发效率, ...
- PacBio全基因组测序和组装
PacBio公司的业务范围也就5个(官网): Whole Genome Sequencing Targeted Sequencing Complex Populations RNA Sequencin ...
- Global Alignment(全局比对)--从算法(Needleman-Wunsch)到python实现
很早就知道有全局比对和局部比对这两种比对方法,都是用到的动态规划的思想,知道一些罚分矩阵的概念,但一直都没有机会搞透彻,一些算法的细节也不太清楚,也没有亲手编程实现. 现在由于项目需求,需要手动写一个 ...
- 解析xml报classnotfound错误
使用dom4j解析XML时,要快速获取某个节点的数据,使用XPath是个不错的方法,dom4j的快速手册里也建议使 用这种方式, 方法是使用Document的selectNodes(String XP ...
- Android Drawable资源
Android实现应用d动画效果:比如App第一次打开的开始动画等 有两种:GIF动画和代码实现. 第一种:借助于Gif制作工具软件实现.一般是和第三方开源的GifView(https://githu ...