最短路径问题——BFS
一.代码实现
void BFS_MIN_Distance(Graph G, int u) {
//d[i]表示u到i的路径
for (i = 0; i < G.vexnum; ++i) {
d[i] = ∞;
path[i] = -1;//最短路径从哪个顶点过来
}
d[u] = 0;
visited[u] = TRUE;
EnQueue(Q, u);
while (!isEmpty(Q)) {
DeQueue(Q, u);
for(w = FirstNeighbor(G, u); w >= 0;w=NextNeighbor(G,u,w))
if (!visited[w]) {
d[w] = d[u] + 1;
path[w] = u;//最短路径应从u到w
visited[w] = TRUE;
EnQueue(Q, w);
}
}
}
二.步骤分析
如:从2开始
初态
d[i]=∞
path[i]=-1
d[2]=0 //2到自身的路径长度为0
visited[2]=TRUE
enqueue2、!isempty,dequeue2
d[2]=0,visited[2]=TRUE
通过FirstNeighbor得到1,d[1]=d[2]+1=1(起点到1路径长度为2),path[1]=2(2走到1),visited[1]=TRUE,enqueue1
通过NextNeighbor得到6,d[6]=d[2]+1=1,path[6]=2,visited[6]=TRUE,enqueue6
队:1、6
!isempty,dequeue1,u=1
通过FirstNeighbor得到2,visited,排除
通过NextNeighbor得到5,!visited,d[5]=d[1]+1=2,path[5]=1(当前是从1到5),visited[5]=TRUE,enqueue5
队:6、5
!isempty,dequeue6,u=6
通过FirstNeighbor得到2,visited,排除
通过NextNeighbor得到3,!visited,d[3]=d[6]+1=1+1=2,path[3]=6,visited[3]=TRUE,enqueue3
通过NextNeighbor得到7,!visited,d[7]=d[6]+1=1+1=2,path[7]=6,visited[7]=TRUE,enqueue7
队:5、3、7
!isempty,dequeue5,跳过
dequeue3,u=3
FirstNeighbor4,!visited
d[4]=d[3]+1=2+1=3
path[4]=3
visited[4]=TRUE
enqueue4
队:7、4
!isempty,dequeue7,u=7
NextNeighbor8,!visited
d[8]=d[7]+1=2+1=3
path[8]=7
visited[8]=TRUE
enqueue8
队:4、8
dequeue4,dequeue8,end
通过粉色表格的d[i]
2到8的最短路径长度为:3(d[8]=3)
通过粉色表格的path[i]
2到8的最短路径为:8←7←6←2
总结:使用BFS,我们可以求解一个满足上述定义的非带权图的单元最短路径问题,这是由广度优先搜索总是按照距离由近到远来遍历图中每个顶点的性质决定的
三.其他
由此我们可以构建一个广度优先生成树
接上例,一定是以2为根的,高度最小的生成树
可以通过生成树直观的看到2到各顶点的最短距离,即该顶点在树中的高度-1