数据结构考研笔记(十九) ——广度优先搜索

图的遍历
从图中某一顶点出发,按照某种搜索方法沿着图中的边对图中的
所有顶点访问一次且仅访问—次。

在这里插入图片描述

编号的顺序就是遍历的顺序
广度优先搜索
·首先访问起始顶点v;
·接着由出发依次访问v的各个未被访问过的邻接顶点Wi,W2....Wi;
·然后依次访问w,,w2.. w,的所有未被访问过的邻接顶点;
·在从这些访问过的顶点出发,访问它们所有未被访问过的邻接顶点;
....,以此类推;

在这里插入图片描述
在这里插入图片描述

visit数组等于0表示未被访问

在这里插入图片描述

开始访问第一个结点1, visit[0] = 1,结点1入队

在这里插入图片描述

结点1出队

在这里插入图片描述

与结点1相连的两个顶点入队 2 、3

在这里插入图片描述

visit[1] visit[2] = 1.

在这里插入图片描述

结点2出队

在这里插入图片描述

结点2相邻的两个结点 4 5 分别人队。

在这里插入图片描述

visit[3]、visit[4] = 1

在这里插入图片描述

访问结点3,结点3出队

在这里插入图片描述

结点3相临的结点6入队,visit[5] =1

在这里插入图片描述

结点4出队

在这里插入图片描述

结点7入队

在这里插入图片描述

visit[6] = 1

在这里插入图片描述

结点5出队

在这里插入图片描述

结点6出队

在这里插入图片描述

结点7出队
bool visited[MAX_TREE_SIZE];
void BFSTraverse(Graph G){
	for(int i=0 ;i<G.vexnum;++i)
		visited[i]=FALSE;
	InitQueue (Q):
	for(int i;i<G.vexnum;++i)
		if(!visited[i])//该顶点没被访问过
			BES(G, i);
}
void BES(Graph G, int v){
	visit(v);
	visited[v]=TRUE;
	EnQueue (Q, v);
	while(!isEmpty (Q)){
		DeQueue(Q, v);
		for(w=FirstNeighbor(G, v);W>=0 ;w=NextNeighbor(G,v,w))
			if(!visited[w]){
				## 标题visit[w];
				visited[w]=TRUE;
				EnQueue (Q, w);
			}
	}
}

在这里插入图片描述

无权图单源最短路径问题

定义从顶点u到顶点v的最短路径d(u,v)为从u到v的任何路径中最少的边数;
若从u到v没有通路,则d(u,v)=∞。
void BES_MIN_Distance (Graph G, int u){
for(int i=0 ; i<G.vexnum; ++i)
d[i]=MAX;
visited[u]=TRUE;
d[u] = 0;
EnQueue (Q, u);
while(!isEmpty(Q) {
DeQueue(Q, u);
for(w=FirstNeighbor(G,u); W>=0; w=NextNeighbor(G,u,w))
if(!visit[w]){
visited[w]=TRUE;
d[w]= d[u]+1;
EnQueue(Q, w);
)

广度优先生成树

在广度遍历过程中,我们可以得到一棵遍历树,称为广度优先生成树(生成森林)。
在这里插入图片描述

*邻接矩阵法的广度优先生成树唯一,邻接表法的不唯一*
【关注微信公众号一起来交流】

·

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

sf9090

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

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

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

打赏作者

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

抵扣说明:

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

余额充值