广度优先搜索 (Breadth-First-Search),即BFS
用途之一:
寻找非加权图(不考虑边的成本)中的任意两点间的最短路径
附:也看到说可以用在爬虫上
BFS基本可以分为下面几个模块:
- 存图(一般存在邻接矩阵/邻接表中),初始化状态数组(记录是否访问,或者访问层数)
- 确定起点与终点,开始搜索并记忆
- 输出步数或者路径
tips:
- 一般来说,用邻接矩阵存图(即二维数组),但情况较为复杂或数据量较大的时候,通常采用新建类/结构体的形式
- bfs部分的实现通常使用queue,它可以保证优先搜索当前层数的所有结点
- 对于有输出路径需求的情况,在bfs时会记录下当前结点的父节点,以便于在输出时可以回溯路径;同时,保存路径可以使用vector以防止栈溢出的情况
- 之所以可以从终点经过唯一路径(最短路)回溯到起点,是因为每个结点(除起点外)都有且只有唯一父节点
尝试用伪代码的方式详述一些核心部分的实现:
- 搜索部分:(伪代码)
void bfs()
{
vis[“起点”] = 初始状态; //通常为true 或者 0
queue<Type> q;
q.push_back(“起点”);
while(!q.empty()){
Type u = q.front(); q.pop(); //取出当前结点
for(i:1->m){
//m个方向
Tpye v = u在i方向上的子节点;
if(超出边界 || 不符合条件 || 已经访问) continue;
vis[v] = 标记状态;
//记录v父节点为u
if(v == 终点){
print(); //自定义输出函数
return ;
}
//其他操作
q.push_back(v); //存入子节点
}
}
return ;
}
- 路径输出部分(依旧是伪代码)
pair<int, int> father_node[maxn][...];
void print(Type u)