最短路径——BFS算法

Posted jev-0987

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最短路径——BFS算法相关的知识,希望对你有一定的参考价值。

最短路径——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[]记录前驱结点

技术图片

技术图片

以上是关于最短路径——BFS算法的主要内容,如果未能解决你的问题,请参考以下文章

经典图算法Java代码实践:BFS,DFS以及几种最短路径算法

最短路径问题之广度优先算法BFS(C语言)

在寻找最短路径时,BFS 和 Dijkstra 的算法有啥区别?

动画演示广度优先算法寻找最短路径

BFS最短路径

leetcode之最短路径+记忆化dfs+bfs+动态规划刷题总结