本某电子科技大学计算机专业的菜鸡立个Flag,从现在开始自学,希望大二的时候能入acm的门,给各位大佬端茶倒水。现在开始记录第一篇有关广度优先算法的博客。
一、含义
这张图非常形象,并且将每个节点访问的先后次序表示出来了,广搜即一层一层的向下寻找,因此适用于寻找最短路径问题。可将这张图看做要从 V1去往V8,没有连线的V之间,无法通过一步转移达到,广搜每一步搜索的时候,只选择可以经过一步状态转移就能达到的相邻节点。
二、写程序要用到的
广搜使用queue队列配合结构体来实现。
几个方法:
先定义一个节点的结构体:
typedef struct{ int x;//节点的横纵坐标 int y; }NODE;
NODE a;
再定义一个以该结构体类型作为元素的队列Q
queue<NODE> Q;
1、Q.pop();//弹出队列中最前面的一个元素,即最早进入的那个元素,让他消失。
2、Q.front();//取出队列中最前面的一个元素的值。
3、Q.empty();//判断队列是否为空。
4、Q.push(a);//将一个相应类型的元素压入队列中。
三、核心代码(模板)
void bfs(int x,int y,int max) { node s,p,b; s.x=x; s.y=y; N.push(s);//将起始元素压入队列 visit[x][y]=true;//访问过了起始元素,标记一下,以免重复访问 while(!N.empty()) { p = N.front();//取出队列最前面的那个元素,以他为新的支点找相邻的可经一步转移达到的状态 N.pop(); for(i=0; i<4; i++) {//原题是有上下左右四个方向可走,所以这里即搜索相邻的四个方向 b.x=p.x+pos[i][0];//对横纵坐标的变换处理 b.y=p.y+pos[i][1]; if(valid(b.x,b.y,max)&&!visit[b.x][b.y]) {//判断是否满足入队条件,即未被访问过,未越界 N.push(b); visit[b.x][b.y]=true;//访问过了节点元素,标记一下 } } } }贴题:洛谷->试炼场->广度优先搜索