寫在前面:科班出身,應屆考研黨,願21考研成功上岸,沖沖衝!
目錄
一、最短路徑問題
單源最短路徑——BFS算法、Dijkstra算法
其中BFS算法(無權圖)、Dijkstra算法(帶權圖,無權圖)
各頂點間的最短路徑——Floyd算法(帶權圖、無權圖)
二、BFS求無權圖的單源最短路徑
注:無權圖可以視爲一種特殊的帶權圖,只是每條邊的權值都爲1
三、代碼實現
bool visited[MAX_VERTEX_NUM];//訪問標記數組
//廣度優先遍歷
void BFS(Graph G,int v){ //從頂點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入隊列
}//if
}//while
}
//求頂點u到其他頂點的最短路徑
void BFS_Distance(Graph G,int u){
for(i = 0;i < G.vexnum;++i){
d[i] = w;
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;
visited[w] = TRUE;
EnQueue(Q,w);
}//if
}//while
}
四、總結
對應的廣度優先生成樹爲
思路就是對BFS的小修改,在visit一個頂點時,修改其最短路徑長度d[]並在path[]記錄前驅結點
2到8的最短路徑長度=d[8]=3
通過path數組可知,2到8的最短路徑爲:8<- 7 <- 6 <- 2