当前位置:  编程技术>c/c++/嵌入式

C++实现广度优先搜索实例

    来源: 互联网  发布时间:2014-10-27

    本文导语:  本文主要叙述了图的遍历算法中的广度优先搜索(Breadth-First-Search)算法,是非常经典的算法,可供C++程序员参考借鉴之用。具体如下: 首先,图的遍历是指从图中的某一个顶点出发,按照某种搜索方法沿着图中的边对图中的...

本文主要叙述了图的遍历算法中的广度优先搜索(Breadth-First-Search)算法,是非常经典的算法,可供C++程序员参考借鉴之用。具体如下:

首先,图的遍历是指从图中的某一个顶点出发,按照某种搜索方法沿着图中的边对图中的所有顶点访问一次且仅访问一次。注意到树是一种特殊的图,所以树的遍历实际上也可以看作是一种特殊的图的遍历。图的遍历主要有两种算法:广度优先搜索(Breadth-First-Search)和深度优先搜索(Depth-First-Search)。

一、广度优先搜索(BFS)的算法思想

广度优先搜索类似于二叉树的层序遍历,它的基本思想就是:首先访问起始顶点v,接着由v出发,依次访问v的各个未访问过的邻接顶点w1,w2,…,wi,然后再依次访问w1,w2,…,wi的所有未被访问过的邻接顶点;再从这些访问过的顶点出发,再访问它们所有未被访问过的邻接顶点……依次类推,直到图中所有顶点都被访问过为止。

广度优先搜索是一种分层的查找过程,每向前走一步可能访问一批顶点,不像深度优先搜索那样有往回退的情况,因此它不是一个递归的算法。为了实现逐层的访问,算法必须借助一个辅助队列,以记录正在访问的顶点的下一层顶点。

如上图所示,为一个有向图,从顶点2开始广度优先遍历整个图,可知结果为2,0,3,1。

二、BFS算法实现

与树相比,图的不同之处在于它存在回路/环,因此在遍历时一个顶点可能被访问多次。为了防止这种情况出现,我们使用一个访问标记数组visited[]来标记顶点是否已经被访问过。

在广度优先搜索一个图之前,我们首先要构造一个图,图的存储方式主要有两种:邻接矩阵、邻接表。这里我们使用邻接表来存储图:

简单起见,我们先假设从起始顶点可以达到其他所有顶点。以有向图为例,C++代码实现:

/************************************************************************* 
  > File Name: BFS.cpp 
  > Author: SongLee 
 ************************************************************************/ 
#include 
#include 
using namespace std; 
 
/* 邻接表存储有向图 */ 
class Graph 
{ 
  int V;            // 顶点的数量 
  list *adj;       // 邻接表 
  void BFSUtil(int v, bool visited[]); 
public: 
  Graph(int V);        // 构造函数 
  void addEdge(int v, int w); // 向图中添加一条边 
  void BFS(int v);       // BFS遍历 
}; 
 
/***** 构造函数 *****/ 
Graph::Graph(int V) 
{ 
  this->V = V; 
  adj = new list[V];   // 初始化V条链表 
} 
 
/* 添加边,构造邻接表 */ 
void Graph::addEdge(int v, int w) 
{ 
  adj[v].push_back(w);     // 将w加到v的list 
} 
 
/* 从顶点v出发广度优先搜索 */ 
void Graph::BFSUtil(int v, bool visited[]) 
{ 
  // BFS辅助队列 
  list queue; 
 
  // 将当前顶点标记为已访问并压入队列 
  visited[v] = true; 
  queue.push_back(v); 
 
  list::iterator i; 
 
  while(!queue.empty()) 
  { 
    // 出队 
    v = queue.front(); 
    cout 

    
 
 

您可能感兴趣的文章:

  • Base64编码原理详解及c++编码解码实现
  • 我实现了个J2EE技术的服务器,支持TCP、UDP和数据库,由于性能的原因,需要改为C或C++实现,我是C、C++新手,我该如何入手呢?看什么样的
  • c++实现MD5算法代码示例
  • java 与 C++ 实现后绑定的方法
  • c++通用模板类(template class)定义实现详细介绍
  • Qt实现的C++框架 qtioccontainer
  • 用C或C++实现主存的分配与回收
  • 在linux系统上,如何用C++实现获取和设置系统时间?
  • 文本压缩算法C++实现 Golden Huffman
  • C++标准库实现 libc++
  • C++的XMLRPC实现 XMLRPC++
  • Java/JavaScript API 的 C++ 实现 libj
  • c++ 连接两个字符串实现代码 实现类似strcat功能
  • c++在unix中如何实现CString的方法?或者说有没有替换CString的类?
  • 请问:java中如何实现C++中的sizeof()方法?
  • 用C或C++编程,模拟可变分区存储管理且首次适应的算法实现存储器的分配与回收
  • vim中如何实现c++代码编写的自动格式化和语法高亮的功能?
  • C++实现CreatThread函数主线程与工作线程交互的方法
  • 请教为什么在C++编译通过并实现的程序,在linux下就会出错
  • linux下c++怎样实现回调(CALLBACK)函数?
  • 在linux下如何用c++实现建立一个文件夹
  • 基于Java实现的图的广度优先遍历算法
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请问在一个servlet里取得一个用singleton模式实现的类实例,那么这个类实例的生命周期是怎样的?
  • 高分求c 实现线程池的一个实例
  • python实现的重启关机程序实例
  • 怎样检测一个对象的实例的存在,并且删除它?程序是怎样实现的?谢谢!
  • python调用短信猫控件实现发短信功能实例
  • Java调用DOS实现定时关机的实例
  • C语言实现杨辉三角实例
  • 那位牛人可以说说实例池的原理和实现??
  • C#实现让窗体永远在窗体最前面显示的实例
  • C语言实现堆排序的简单实例
  • 使用C#实现在屏幕上画图效果的代码实例
  • java实现大数加法(BigDecimal)的实例代码
  • C#实现装箱与拆箱操作简单实例
  • C#实现随鼠标移动窗体实例
  • 实现DataGridView控件中CheckBox列的使用实例
  • ThinkPHP实现批量删除数据的代码实例
  • C#下实现创建和删除目录的实例代码
  • jQuery实现回车键(Enter)切换文本框焦点的代码实例
  • jquery实现弹出div,始终显示在屏幕正中间的简单实例
  • ******"Servlet根据JSP视图的需求生成JavaBeans的实例并输出给JSP环境"如何实现上面这句话的效果??*******
  • 通过javascript实现DIV居中,兼容各浏览器版本
  • socket实现多文件并发传输,求助多线程实现问题?
  • Python GUI编程:tkinter实现一个窗口并居中代码
  • interface 到底有什么用???实现接口,怎么实现??
  • 通过javascript库JQuery实现页面跳转功能代码
  • 怎么用Jsp实现在页面实现树型结构?
  • sharepoint 2010 使用STSNavigate函数实现文件下载举例
  • windows 下的PortTunnel 在linux下怎么实现?或者相应的已经实现的软件?端口映射
  • php实现socket实现客户端和服务端数据通信源代码
  • 网站重定向用C语言实现iptables,ACL实现
  • flash AS3反射实现(describeType和getDefinitionByName)




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3