数据结构笔记——最短路径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

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