前言
本博客是博主用于复习数据结构以及算法的博客,如果疏忽出现错误,还望各位指正。
广度优先搜索的原理
好了,还是这张图,不过是广度优先搜索
不难看出,就是“一层一层”搜
这次咱从A开始,因为如果从B开始的话,只需要一次,搜索过程就是
B直接搜完,入队A C D E,isVistied全部ture,结束
所以从A开始
A开始,入队B、C,对应isVistited变为true
B出队,遍历,A,C已经遍历过,队尾入D、E,变true
C出队,没新的可入的
D出队
E出队
OK结束
所以,基本原理就是咱上一节说的:我的回合,碰到邻接结点先存起来,我的回合结束,再进入新的回合(队头)
广度优先搜索的代码实现
好了,说完原理,我们来进行代码实现
还是那两个方法
一个是寻找当前结点的第一个邻接结点
//获取index行 第一个邻接结点
public int getFirstNeighbor(int index){
for(int i = 0;i < vertexList.size();i++){
if(edges[index][i] != Integer.MAX_VALUE){
return i; //找到就返回邻接结点的坐标
}
}
return -1; //没找到的话,返回-1
}
另一个就是寻找当前结点的邻接结点的邻接结点(有点抽象,不过请看代码)
//获取row行 column列之后的第一个邻接结点
public int getNextNeighbor(int row,int column){
for(int i = column + 1;i < vertexList.size();i++){
if(edges[row][i] != Integer.MAX_VALUE){
return i; //找到就返回邻接结点的坐标
}
}
return -1; //没找到的话,返回-1
}
之后就是主要的从哪个点开始进行BFS,最后那是要格外注意的,先前没有进入递归,因为是我的回合不停下,可以对比DFS,咱就可以理解了。
DFS里面,会调用含参DFS,之后再回到我的回合继续
BFS就是,入队,然后一直是我的回合
public void BFS(int index,boolea