6-9图-最短路径问题BFS

最短路径问题——BFS

一.代码实现

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)) {
		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;//最短路径应从u到w
				visited[w] = TRUE;
				EnQueue(Q, w);
			}
	}
}

二.步骤分析

如:从2开始

初态
d[i]=∞
path[i]=-1
d[2]=0 //2到自身的路径长度为0
在这里插入图片描述
在这里插入图片描述
visited[2]=TRUE
enqueue2、!isempty,dequeue2
d[2]=0,visited[2]=TRUE
通过FirstNeighbor得到1,d[1]=d[2]+1=1(起点到1路径长度为2),path[1]=2(2走到1),visited[1]=TRUE,enqueue1
通过NextNeighbor得到6,d[6]=d[2]+1=1,path[6]=2,visited[6]=TRUE,enqueue6
队:1、6
在这里插入图片描述
在这里插入图片描述
!isempty,dequeue1,u=1
通过FirstNeighbor得到2,visited,排除
通过NextNeighbor得到5,!visited,d[5]=d[1]+1=2,path[5]=1(当前是从1到5),visited[5]=TRUE,enqueue5
队:6、5
在这里插入图片描述
在这里插入图片描述
!isempty,dequeue6,u=6
通过FirstNeighbor得到2,visited,排除
通过NextNeighbor得到3,!visited,d[3]=d[6]+1=1+1=2,path[3]=6,visited[3]=TRUE,enqueue3
通过NextNeighbor得到7,!visited,d[7]=d[6]+1=1+1=2,path[7]=6,visited[7]=TRUE,enqueue7
队:5、3、7
在这里插入图片描述
在这里插入图片描述
!isempty,dequeue5,跳过
dequeue3,u=3
FirstNeighbor4,!visited
d[4]=d[3]+1=2+1=3
path[4]=3
visited[4]=TRUE
enqueue4
队:7、4
在这里插入图片描述
在这里插入图片描述
!isempty,dequeue7,u=7
NextNeighbor8,!visited
d[8]=d[7]+1=2+1=3
path[8]=7
visited[8]=TRUE
enqueue8
队:4、8
dequeue4,dequeue8,end
在这里插入图片描述
在这里插入图片描述
通过粉色表格的d[i]
2到8的最短路径长度为:3(d[8]=3)

通过粉色表格的path[i]
2到8的最短路径为:8←7←6←2

总结:使用BFS,我们可以求解一个满足上述定义的非带权图的单元最短路径问题,这是由广度优先搜索总是按照距离由近到远来遍历图中每个顶点的性质决定的

三.其他
由此我们可以构建一个广度优先生成树
接上例,一定是以2为根的,高度最小的生成树
在这里插入图片描述
在这里插入图片描述
可以通过生成树直观的看到2到各顶点的最短距离,即该顶点在树中的高度-1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卡__卡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值