宽度优先搜索算法
1.概述:
宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。
之所以称之为宽度优先算法,是因为算法自始至终一直通过已找到和未找到顶点之间的边界向外扩展,就是说,算法首先搜索和s距离为k的所有顶点,然后再去搜索和S距离为k+l的其他顶点。
例题hdu 1242
http://acm.hdu.edu.cn/showproblem.php?pid=1242
http://blog.csdn.net/zhuihunmiling/article/details/8979570(DFS做法)
这一此我们介绍广度优先搜索
按照惯例,我们还是先说一下该题目的主要易错点
1.天使可能有多个朋友,所以不能从朋友的位置开始着天使,只能是从天使找离他最近的朋友
2.题目要求的是找到一个用时最少的朋友,而不是步数最少
既然是广度优先,那么必然用到队列,但是队列只能是先进先出,即是步数少的先遍历到,显然是不符合题目要求的,那应该怎么办呢?
c++给我们提供了标准的函数库,可以引入#include
如果排序不符合要求,可以给出小于号 “<” 的运算符重载函数,当然在结构体里面进行了,代码里面有具体的实现
广度优先搜索依然是简单的 出队--》判断--》扫描---》入队 的四部曲。结构简单,程序也容易实现,现直接给出代码实现
? ? ? ? ? ? ? ? ?
#include
//优先队列解决,广度优先 struct Persion
?? {
?? int x,y; ?? int time;
?? friend bool operator < (const Persion &a,const Persion &b) ?? {
?? return a.time>b.time; //\返回队列中较小的元素;\则返回队列中较大的元素 ?? } ?? ?? }; ??
?? int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; ?? char map[N][N]; ?? int visited[N][N]; ?? int m,n; ?? ??
?? int BFS(int x,int y) ?? { ?? ??
?? priority_queue
?? memset(visited,0,sizeof(visited)); ??
?? current.x=x; ?? current.y=y; ?? current.time=0;
?? visited[current.x][current.y]=1; ?? q.push(current); ?? ??
?? while(!q.empty()) ?? { ??
?? current=q.top(); ?? q.pop();
?? for(int i=0;i<4;i++) ?? {
?? next.x=current.x+dir[i][0]; ?? next.y=current.y+dir[i][1]; ??
??
if(next.x>=0&&next.x ?? if(map[next.x][next.y]=='r') ?? return current.time+1; ?? ?? ?? ?? if(map[next.x][next.y]=='x') ?? next.time=current.time+2; ?? else ?? next.time=current.time+1; ?? ?? visited[next.x][next.y]=1; ?? q.push(next); ?? ?? } ?? } ?? ?? ?? } ?? ?? return -1; ?? } ?? ?? int main() ?? { ?? ?? ?? ?? int i,j; ?? Persion angle; ?? ?? while(cin>>n>>m&&(m||n)) ?? { ?? ?? for(i=0;i ?? cin>>map[i][j]; ?? if(map[i][j]=='a') ?? { ?? angle.x=i; ?? angle.y=j; ?? } ?? } ?? ?? ??? int time=BFS(angle.x,angle.y); ??? ??? ??? if(time==-1) ??? cout<<\< ??? cout<