最近几天没咋注重做题,自己读题大部分都有障碍,需要借助翻译。把课件上的代码自己亲手敲了一遍,发现其实有很多细节上的问题,不知道换别的题能不能处理好。
切入正题,这次主要总结一下广度优先搜索(BFS)。
1) 算法原理
广度优先搜索即Breadth First Search,也是图遍历算法的一种。用一句话概括就是:“我会分身我怕谁?!”。
BFS的具体算法描述为选择一个起始点v放入一个先进先出的队列中,执行如下操作:
a. 如果队列不为空,弹出一个队列首元素,记为当前结点,执行b;否则算法结束;
b. 将与 当前结点 相邻并且尚未被访问的结点的信息进行更新,并且全部放入队列中,继续执行a;
维护广搜的数据结构是队列和HASH,队列就是官方所说的open-close表,HASH主要是用来标记状态的,比如某个状态并不是一个整数,可能是一个字符串,就需要用字符串映射到一个整数,可以自己写个散列HASH表,不建议用STL的map,效率奇低。
算法实现 广搜一般用队列维护状态,写成伪代码如下: def BFS(v): resetArray(visited,false) visited[v] = true queue.push(v) while not queue.empty(): v = queue.getfront_and_pop() for u in adjcent_list[v]: if visited[u] is false: dosomething(u) queue.push(u) 3)基础算法样式 int bfs() { /初始化,初始状态存入队列; 队列首指针 head = 0; 尾指针 tail = 1;/ do { /指针 head 后移一位,指向扩展节点;/ for(int i = 1;i<=max;i++) //max为产生子节点的规则数; { if(子节点符合条件) { tail指针增1,把新节点存入列尾; if(新节点与原已产生节点重复) 删去该节点(取消入队,tail减1); else if(新节点是目标节点) 输出并退出; } } }while(head<tail); //队列为空; }