最短路徑——BFS算法
單源最短路徑問題
每對頂點間的最短路徑
BFS求無權圖的單源最短路徑
bool visited[MAX_VERTEX_NUM]; //訪問標記數組
//廣度優先遍歷
void BFS(Graph G,int v){ //從定點出發,廣度優先遍歷圖G
visit(v); //訪問初始頂點v
visited[v]=TRUE; //對v做已訪問標記
Enqueue(Q,v); //頂點v入隊列Q
while(!isEmpty(Q)){
DeQueue(Q,v); //頂點v出隊列
for(w=FirstNeighbor(G,v);
w>=0;w=NextNeighbor(G,v,w))
//檢測v所有鄰接點
if(!visited[w]){ //w為v的尚未訪問的鄰接頂點
visit(w); //訪問頂點w
visited[w]=TRUE;//對w做已訪問標記
EnQueue(Q,w); //頂點w入隊列
}
}
}
//求頂點 u 到其他頂點的最短路徑
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; //對v做已訪問標記
Enqueue(Q,u); //頂點v入隊列Q
while(!isEmpty(Q)){
DeQueue(Q,u); //頂點v出隊列
for(w=FirstNeighbor(G,u);
w>=0;w=NextNeighbor(G,u,w))
//檢測v所有鄰接點
if(!visited[w]){ //w為v的尚未訪問的鄰接頂點
d[w] = d[u]+1; //路徑長度加1
path[w]=u; //最短路徑應從u到w
visited[w]=TRUE;//設已訪問標記
EnQueue(Q,w); //頂點w入隊列
}
}
}
就是對BFS的小修改,在visit一個頂點時,修改最短路徑長度d[]並在path[]記錄前驅結點