图的广度优先搜索(Breadth First Search)

来源:互联网 发布:des3在线加密解密 php 编辑:程序博客网 时间:2024/04/16 07:13

基本思想:

首先访问初始点v,之后依次访问v的各个未成访问过的邻接点,然后分别从这些邻接点出发依次访问他们的邻接点,直至图中所有已被访问的顶点的邻接点都被访问到。

图的广度优先遍历类似于树的按层次遍历的过程,要用到数据结构队列,下面直接给出实现代码。

#include <cstdlib>#include <iostream>#include <queue>#include "graph.h"template<class T>void BFS(const Graph<T>& g, int v, vector<bool>& visit){queue<int> q;cout<<g.getVertexName(v)<<" ";visit[v] = true;q.push(v);int w;while(!q.empty()){v = q.front();q.pop();w = g.getFirstNeighbor(v);while(w != -1){if(!visit[w]){cout<<g.getVertexName(w)<<" ";visit[w] = true;q.push(w);}w = g.getNextNeighbor(v,w);}}}template<class T>void breadthFirstSearch(const Graph<T>& g, vector<bool>& visit){int n = g.getNumberOfVertex();for(int v=0; v<n; v++){if(!visit[v])BFS(g,v,visit);}}int main(int argc, char *argv[]){Graph<char> graph("graph3.dat");cout<<"after read the graph :"<<endl;graph.printGraph();int n = graph.getNumberOfVertex();vector<bool> visit(n,false);cout<<"BFS: ";breadthFirstSearch(graph,visit);cout<<endl<<endl;    system("PAUSE");    return EXIT_SUCCESS;}

作为单个函数实现如下:

template<class T>void breadthFirstSearch(const Graph<T>& g, vector<bool>& visit){int n = g.getNumberOfVertex();queue<int> q;int w;for(int v=0; v<n; v++){if(!visit[v])//顶点v未被访问 {visit[v] = true;cout<<g.getVertexName(v)<<" ";//访问顶点v q.push(v);while(!q.empty())//队列非空 {v = q.front();q.pop();w = g.getFirstNeighbor(v);while(w != -1){cout<<g.getVertexName(w)<<" ";visit[w] = true;q.push(w);w = g.getNextNeighbor(v,w);}}}}}

参考资料:

[1]《数据结构》刘大有 唐海鹰等著 高等教育出版社

[2][严蔚敏《数据结构(C语言版)》