广度优先搜索

图的广度优先搜索遍历类似(BFS)类似于树的层次遍历

基本思想:首先访问起始顶点 v ,然后选取与 v 邻接的全部顶点 w1 , … , wn 进行访问,再依次访问与 w1 , … , wn 邻接的全部顶点(已经访问过的除外),以此类推,直到所有顶点都被访问为止。

广度优先搜索遍历图的时候,需要用到一个队列(二叉树的层次遍历也要用到队列),算法的执行过程可以简单的概括如下:

1)选取任一顶点进行访问,并将这个顶点标记为已访问;
2)当队列不为空的时候循环执行:入队,依次检查出队顶点的全部邻接顶点,访问没有被访问过的邻接顶点并将其入队
3)当队列为空时跳出循环,广度优先搜索遍历完成


以邻接表为存储结构的广度优先搜索遍历算法如下:

void BFS(AGraph *G, int v, int visit[maxSize]){
	
	ArcNode *p;
	int que[maxSize], front=0, rear=0;	//定义队列,简单写法 
	int j;
	Visit(v);	//访问顶点 v 的函数 
	visit[v] = 1;	//标记已访问
	
	rear = (rear+1)%maxSize;	//当前顶点 v 入队 
	que[rear] = v;
	
	while(front!=rear){
		
		front = (front+1)%maxSize;	//顶点出队 
		j=que[front];
		p = G->adjlist[j].firstarc;	//p指向出队顶点 j 的第一条边 

		
		while(p!=NULL){			//将 p 的所有未被访问的邻接顶点入队 
			
			if(visit[p->adjvex] == 0){	//当前顶点未被访问则入队 
				Vistit(p->adjvex)
				vivit[p->adjvex] = 1;
				rear = (rear+1)%maxSize;
				que[rear] = p->adjvex; 
			}
			p = p->nextarc;			//p 指向 j 的下一条边 
		}
	} 
} 

以上遍历算法是针对连通图。对于非连通图的遍历,只需要将上诉函数放在一个循环中,循环检测图中的每一个顶点,如果当前顶点没有被访问,则调用函数从这个顶点遍历,否则什么都不做
(1)深度搜索遍历

void dfs(AGraph *G){
	
	int i;
	for(int i=0;i<G->n;i++){
		
		if(visit[i]==0){
			
			DFS(G,i);
			
		}
	}
} 

(2)广度搜索遍历

void bfs(AGraph *G){
	
	int i;
	for(int i=0;i<G->n;i++){
		
		if(visit[i]==0){
			
			BFS(G,i,visit);
			
		}
	}
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

陌上人如玉এ

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

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

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

打赏作者

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

抵扣说明:

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

余额充值