(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,故这个 ...
随机推荐
- JavaWeb学习总结(五)—Myecplise的优化
1.设定项目的默认编码 General --> Workspace --> UTF-8 2.设定JSP的打开方式,默认会很占内存 General --> Editors --> ...
- Target runtime Apache Tomcat v7.0 is not defined.
打开项目,找到.settings--->org.eclipse.wst.common.project.facet.core 修改这个文件中: <?xml version="1.0 ...
- epoll中et+多线程模式中很重要的EPOLL_ONESHOT实验
因为et模式需要循环读取,但是在读取过程中,如果有新的事件到达,很可能触发了其他线程来处理这个socket,那就乱了. EPOLL_ONESHOT就是用来避免这种情况.注意在一个线程处理完一个sock ...
- Delphi 过程与函数
注:该内容整理自以下链接. http://chanlei001.blog.163.com/blog/static/340306642011111615445266/ delphi 过程以保留字proc ...
- STM32学习笔记(一) 如何新建一个STM32工程模板
学习stm32,第一步就是选择开发工具了,GCC,MDK,IAR每一种都有自己的优劣势,这里我选择使用MDK软件实现STM32模板.当然如果想更快的接触stm32实例,领略嵌入式开发的魅力,STM也提 ...
- D3.js 插入元素,删除元素
插入元素涉及的函数有两个: 一.append():在选择集末尾插入元素 假设有三个段落元素 <p>Apple</p> <p>Pear</p> <p ...
- Spring Boot修改内置Tomcat端口号 (zhuan)
http://blog.csdn.net/argel_lj/article/details/49851625 ********************************************* ...
- OpenGL的glTranslatef平移变换函数详解
OpenGL的glTranslatef平移变换函数详解 glTranslated()和glTranslatef()这两个函数是定义一个平移矩阵,该矩阵与当前矩阵相乘,使后续的图形进行平移变换. 我们先 ...
- IOS开发证书变成“此证书的签发者无效”解决方法
IOS开发证书全部变成无效,如下图 打包提示错误 解决方法: 1. 下载https://developer.apple.com/certificationauthority/AppleWWDRCA ...
- vsftp搭配iptables的配置
[similarface@InnerTest vsftpd]$ ll total 48 -rw------- 1 root root 125 Mar 23 02:26 ftpusers -rw-r-- ...