前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >广度优先搜索遍历图

广度优先搜索遍历图

作者头像
每天学Java
发布2020-06-01 10:45:33
6560
发布2020-06-01 10:45:33
举报
文章被收录于专栏:每天学Java
广度优先搜索

广度优先搜索每次以扩散的方式向外访问顶点。和树的遍历一样,使用BFS遍历图,需要使用队列,通过反复取出队列首顶点,将该顶点可达到的但未曾达到的顶点入队列,直到队列为空 时遍历结束

实现过程

对于图采用广度优先遍历和二叉树遍历方式类似,我们首先判断顶点是否遍历过,如果没有加入队列, 然后将其可达的节点进行入队(需要判断是否已经经过),遍历队列中的元素。

实现代码(C++)
代码语言:javascript
复制
//
//  main.cpp
//  BFSGraph
//
//  Created by 陈龙
//  Copyright © 2019 陈龙. All rights reserved.
//

#include <iostream>
#include <queue>
#include <vector>
using namespace std;

//最多节点
const int  N =100;
//图顶点
struct graph{
    int v;
    int w;
    graph(int _v,int _w):v(_v),w(_w){};
};
//vectot
vector<graph> ver[N];
queue<int> que;
queue<int> res;
//
int vis[N];
//
void BFS(int v){
    //设置为已路过
    que.pop();
    if (vis[v]==1) {
         return;
    }
    vis[v] = 1;
    //放入结果队列
    res.push(v);
    //将节点可达且未l经过的顶点入队列
    for (int i=0; i<ver[v].size(); i++) {
        if (vis[ver[v][i].v]==0) {
            que.push(ver[v][i].v);
        }
    }
    while (!que.empty()) {
        BFS(que.front());
    }
}
void BFSTrave(){
    for (int i=0; i<N; i++) {
        if (ver[i].size()>0) {
            que.push(i);
            BFS(i);
        }
    }
}
int main(int argc, const char * argv[]) {
    // insert code here...
    ver[0].push_back(graph(4,2));
    ver[0].push_back(graph(2,2));
    ver[1].push_back(graph(2,2));
    ver[1].push_back(graph(3,2));
    ver[1].push_back(graph(4,2));
    ver[2].push_back(graph(3,2));
    ver[4].push_back(graph(5,2));
    ver[6].push_back(graph(5,2));
    ver[7].push_back(graph(8,2));
    
    BFSTrave();
    while (!res.empty()) {
        cout<<res.front()<<endl;
        res.pop();
    }
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 每天学Java 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 广度优先搜索
  • 实现过程
  • 实现代码(C++)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档