码迷,mamicode.com
首页 > 其他好文 > 详细

图的广度优先搜索(BFS)

时间:2014-05-09 10:06:35      阅读:337      评论:0      收藏:0      [点我收藏+]

标签:style   blog   class   code   java   ext   

        图的遍历主要有两种方法,第一种是之前博文中介绍过的“图的深度优先遍历”,简称DFS;另一种就是图的广度优先遍历(BFS),在本文中将进行简要探讨。

        BFS要做的事,从给定点出发,遍历的一次探寻到所有顶点。其基本思路很容易理解,在此我们利用队列q来存储访问的顶点,用visited[]数组(初始化所有值为false)来标记给顶点是否被访问过。基本实现为:对于初始给定点,首先将其加入队列,并标记为已访问;之后重复如下操作,从队列中取出首元素,遍历其邻接顶点,只要未访问,就加入到队列中,并对visited相应值标记;当队列为空时,搜索完毕。

        要注意的是,本文实现的方法同样适用于联通对,对于有多个连通分量的图,需要在完成一次遍历之后,检查是否所有visited值均标记为true,即已访问。若存在未访问的点,则任取一点,重复以上遍历过程,直至所有点均被遍历过截止。

        按照一贯的风格,下面给出示例代码。本代码图的实现及相关函数依然基于前面的博文中C++ 图的实现,可加以参考,此处不赘述其实现。

bubuko.com,布布扣
/*
*图的深度优先遍历 ---递归与非递归实现
*FileName: BFS.cpp 
* ----By F8Master
*/

#include"Graphlnk.h"
#include"Graphmtx.h"
#include<iostream>
#include<queue>
using namespace std;

template < class T, class E>
void BFS(Graphmtx<T,E> &G , const T &v)
{
    queue<int> q;
    int loc,next,out;
    int n = G.NumberOfVertices();
    bool *visited = new bool[n];//访问记录数组
    for(int i = 0;i<n;i++)
        visited[i] = false;

    loc = G.getVertexPos(v);
    q.push(loc);
    visited[loc] = true;
    while(!q.empty())
    {
        out = q.front();
        q.pop();
        cout<<G.getValue(out)<< " ";
        next = G.getFirstNeighbor(out);
        while(next!=-1)
        {
            while(visited[next]==false)
            {
                visited[next] = true;
                q.push(next);
            }
            next = G.getNextNeighbor(out,next);
        }
    }
}

void test_BFS()
{
    cout<<"-----Test for BFS-----"<<endl;
    char first;
    Graphmtx<char,int> g;
    //Graphlnk<char ,int> g(30);
    g.inputGraph();
    g.outputGraph();
    cout<<"输入广度优先搜索的第一个点:"<<endl;
    cin>>first;
    BFS(g,first);
}
bubuko.com,布布扣
为进行测试,构造如下方的图

bubuko.com,布布扣

在以上实现中,基于邻接矩阵存储数据,简单的人工分析可知从A开始搜索得到的遍历序列应该为:A E F G D C H I B

经测试,结果如下:

bubuko.com,布布扣

图的广度优先搜索(BFS),布布扣,bubuko.com

图的广度优先搜索(BFS)

标签:style   blog   class   code   java   ext   

原文地址:http://www.cnblogs.com/f8master/p/3716818.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!