最短路径问题之广度优先算法BFS(C语言)
Posted bfhonor
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最短路径问题之广度优先算法BFS(C语言)相关的知识,希望对你有一定的参考价值。
一、单源最短路径
(一)最短路径问题
- “G港”是个物流集散中⼼,经常需要往各个城市运东⻄,怎么运送距离最近?——单源最短路径问题
- 各个城市之间也需要互相往来,相互之间怎么⾛距离最近?——每对顶点间的最短路径
(二)最短路径BFS算法(无权图)
bool visited[MAX_VERTEX_NUM]; //访问标记数组,👉初始都为false
//广度优先遍历
void BFS(Graph G, int v){ //从顶点v出发,广度优先遍历图G
visit(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入队列
}
}
}
}
1. 新增数组存储找到结点的顺序数
//求顶点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;
EnQueue(Q,u);
while(!isEmpty(Q)){//BFS算法主过程
DeQueue(Q,u); //队头元素u出队
for(w=FirstNeighbor(G,u); w>=0; w=NextNeighbor(G,u,w)){
if(!visited[w]){//w为u的尚未访问的邻接顶点
d[w]=d[u]+1;//路径长度+1
path[w]=u;//最短路径应从u到w
visited[w]=TRUE;//设已访问标记
EnQueue(Q,w);//顶点w入队
}
}
}
}
以上是关于最短路径问题之广度优先算法BFS(C语言)的主要内容,如果未能解决你的问题,请参考以下文章