最短路径问题之广度优先算法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语言)的主要内容,如果未能解决你的问题,请参考以下文章

最短路径——BFS算法

用c语言编程 1创建图的邻接矩阵和邻接表 2验证图的深度优先、广度优先遍历算法 3验证最短路径

用c语言实现先到先处理和最短路径优先的cpu调度算法

最短路径问题与广度优先搜索

算法图解:广度优先搜索

万能的搜索--之BFS