图的遍历-广度优先遍历

广度优先遍历类似于树的按层次遍历的过程。

规则:访问v,访问v的各未访问的邻接点,之后逐个从这些邻接点出发重复上述操作。待与v连通的顶点访问毕再从另一顶点出发。

实现:对各个顶点v,若其尚未访问则访问,之后v入队,队顶元素出队,逐个访问其尚未访问的邻接点,每的访问完一个便入队。重复直到队空。

输入:创建图。

输出:广度优先遍历顶点序列。

运行结果:

算法实现:

邻接矩阵存储:

void BFSTraverse(MGraph G,Status (*visit)(MGraph G,int v)){ 
    /*图的广度优先遍历
    访问v 访问v的各为访问的邻接点 之后逐个从这些邻接点出发重复上述操作
    待与v连通的顶点访问毕再从另以顶点出发 对各个顶点v 若其尚未访问则访
    问v 之后v入队 对顶元素出队 逐个访问其尚为访问的邻接点,每访问完一个
    就入队 重复直到队列空
    每个顶点进一次队 出队时主要操作查找邻接点*/
    int v;
    LinkQueue Q;
    InitQueue(Q);
    for(v=0;v<G.vexnum;v++) //初始化
        visited[v]=FALSE;
    for(v=0;v<G.vexnum;v++){
	if(!visited[v]){
	    visit(G,v);
            visited[v]=TRUE;
            EnQueue(Q,v);
            while(!QueueEmpty(Q)){
	        DeQueue(Q,v);
	        for(int w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w)) {
	            if(!visited[w]) {
		        visit(G,w);
			visited[w]=TRUE;
		        EnQueue(Q,w);
		    }
	        }
	    }
	}
    }
}

邻接表存储:

void BFSTraverse(ALGraph G,Status (*visit)(ALGraph G,int v)){
    /*图的广度优先遍历
    访问v 访问v的各未访问的邻接点,之后逐个从这些邻接点出发重复上述操作
    待与v连通的顶点访问毕再从另以顶点出发 对各个顶点v 若其尚未访问则访
    问v 之后v入队 对顶元素出队 逐个访问其尚为访问的邻接点,每访问完一个
    就入队 重复直到队列空
    每个顶点进一次队 出队时主要操作查找邻接点*/
    int v,w;
    LinkQueue Q;
    InitQueue(Q);
    for(v=0;v<G.vexnum;v++)//初始化
       visited[v]=FALSE;
    for(v=0;v<G.vexnum;v++){
        if(!visited[v]){
	     visit(G,v);
	     visited[v]=TRUE;
	     EnQueue(Q,v);
	     while(!QueueEmpty(Q)){
                 DeQueue(Q,v);
		 for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w)){
		     if(!visited[w]) {
		         visit(G,w);
	                 visited[w]=TRUE;
	                 EnQueue(Q,w);
		     }
		 }
	     }
	}
   }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值