广度搜索

ACM入门(3)——图的遍历——广度优先搜索
基本算法: 
由Moore和Lee独立提出 
给定图G和一个源点s, 广度优先遍历按照从近到远的顺序考虑各条边. 算法求出从s到各点的距离 
广度优先的过程对结点着色. 
白色: 没有考虑过的点 
黑色: 已经完全考虑过的点 
灰色: 发现过, 但没有处理过, 是遍历边界 
依次处理每个灰色结点u, 对于邻接边(u, v), 把v着成灰色并加入树中, 在树中u是v的父亲(parent)或称前驱(predecessor). 距离d[v] = d + 1 
整棵树的根为s 


BFS算法: 
BFS(G,s)//从s点开始对图G广度优先搜索for each vertex u∈V[G]-{s}        do color← white//每个点赋值为未处理          d←∞  //每个点与源点的距离标志为∞∏←NIL       //每个点赋值为没有父亲color[s] ←gray              //s点标为正在处理d[s] ←0                     //s点与源点的距离为0Q ←ф                   //建空队列保存灰色顶点ENQUEUE(Q,s)       //源点入队列While(Q≠ф)    do u ←DEQUEUE(Q);//从队列中拿出一个元素进行处理         for each v ∈Adj //对没有处理过的邻接点进行处理              do  if  color[v]=white                        then color[v] ←gray                                d[v]=d+1∏[v]=u                                ENQUEUE(Q,v)         color=black//标记为处理完毕


用BFS求最短路: 
定理: 对于无权图(每条边的长度为1), BFS算法计算出的d是从s到i的最短路 
满足d=1的点一定是正确的(因为长度至少为1), 并且其他点都满足d>1. 容易证明对于任意距离值x, d=x的点一定是正确的, 而且白色点(没有计算出距离的点)的距离一定至少为x+1 
更进一步, 根据每个点的parent值, 可以计算出它到s的一条最短路 
Bfs算法中路径的打印 
Print-Path(G,s,v) 
①   if(v==s) 
②        then print s 
③        else if ∏[v]=NIL 
④                  then print “no path from ”s”to” v”exits” 
⑤                  else Print-path(G,s, ∏[v]) 
⑥                         print v 

你可能感兴趣的:(广度搜索)