zoukankan      html  css  js  c++  java
  • 图的广度优先搜索(BFS)

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

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

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

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

            

    /*
    *图的深度优先遍历 ---递归与非递归实现
    *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);
    }

            为进行测试,构造如下方的图


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

            经测试,结果如下:



  • 相关阅读:
    UVA 408 (13.07.28)
    linux概念之用户,组及权限
    Java实现 蓝桥杯 历届试题 网络寻路
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 九宫重排
    Java实现 蓝桥杯 历届试题 九宫重排
  • 原文地址:https://www.cnblogs.com/f8master/p/3826072.html
Copyright © 2011-2022 走看看