BFS算法的实验范例(java)

最近一直都在学习BFS算法,故作此来梳理一下。

首先先介绍一下BFS,BFS(Breadth-first-search)广度优先搜索,又称为宽度优先搜索,是图的搜索算法之一。与深度优先搜索不同的是,广度优先搜索会先搜索到与起始点距离比较近的点,而深搜却是沿着一个分支递归到最后。

系统的扯一下~

给定图G和一个原点s,按照由近及远的顺序,BFS遍历逐层访问s可达的所有节点,并计算从s到各节点的距离(即s至各节点的路径上的边数),其中s至节点v的距离值:(v∈V)

1.当s与v间不连通时,d[v]=-1

2.当s与v间连通时,d[v]=s与v间的最短路长

初始的时候,d[s]=0,其他节点的d值为-1,广度优先遍历过程如下:

顺序处理每个已访问的节点u:遍历访问所有与u邻接的未访问的节点v((u,v)∈E,d[v]==-1)。由于u是v的父亲或者前驱,因此v的距离值d[v]=d[u]+1。(划重点,+1的原因)

由于是按照层次进行的,且通过“先进先出”的原则来实现,此时可以使用队列(下篇博文会提及到)。拟定一个队列Q,按照先后顺序存储被访问过的节点,步骤如下:

1.首先源点s入队列Q,d[s]=0;

2.然后依次访问所有与s相邻的未被访问过的节点v((u,v)∈E,d[v]==-1),d[v]=d[s]+1=1,并将v加入队列Q中;

3.接下来按照先进先出的原则来扩展队首的节点,每扩展一个队首节点u,节点u出队列,所有与u相邻的未被访问的节点v((u,v)∈E,d[v]==-1)入队列Q其距离值为d[v]=d[u]+1;

4.依次类推,直至队列Q为空。

BFS遍历从源点s出发,由近及远,依次访问和s有路径相连且路长为1,2,3.....的节点,最终形成一颗以s为根的BFS遍历树。

其算法如下:

void bfs(vlink g[],int v){
s int w;
   处理节点;    d[v]=0;//置节点v的距离值    addQ(Q,v);//v进入队列Q    while(!emptyQ(Q)){//若不为空,则循环      v=delQ(Q);//出队    取v的第1个邻接点w;//若v无邻接点,则w=-1      while(w!=-1){//反复搜索未访问的邻接点        if(d[w]==-1){//若没有访问         处理邻接点w;          addQ(Q,w);//邻接点w入队          d[w]=d[v]+1;//计算邻接点w的距离值        }      取v的下一个邻接点w;      }    }  }

BFS与DFS相比较:

深度优先搜索用栈(stack)来实现:

1. 把起始顶点压入栈中。

2. 每次从栈顶取出一个顶点,搜索所有它的未访问相邻顶点,把这些顶点压入栈中。

3. 重复执行第二步操作,直至找到所要找的顶点或者栈为空时结束程序。

广度优先搜索使用队列(queue)来实现:

1. 把起始顶点放到队列中。

2. 每次从队首取出一个顶点,查看这个顶点所有的未访问相邻顶点,把它们放到队尾。

3. 重复执行第二步操作,直至找到所要找的顶点或者队列为空时结束程序。


参考书籍:吴永辉老师,王建德老师,数据结构编程实验第二版  机械工业出版社




你可能感兴趣的:(BFS,java)