數據結構筆記——最短路徑BFS算法

寫在前面:科班出身,應屆考研黨,願21考研成功上岸,沖沖衝!

目錄

一、最短路徑問題

二、BFS求無權圖的單源最短路徑

三、代碼實現

四、總結

一、最短路徑問題

單源最短路徑——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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章