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
基本算法:
由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