图的广度优先搜索

翻译 2012年03月21日 20:16:17

      图的广度优先搜索基本思想和树的层次遍历差不错。与树的层次遍历不同的是,图中可能包含回路,我们遍历完一个节点,继续进行遍历,可能会回到已经遍历过的节点。为了避免遍历一个节点两次,需要开辟一个bool型的数组来标记该节点是否已经遍历过。

      例如,在下图中,我们从节点2开始遍历,当我们到达节点0以后,继续寻找节点0的邻接点,节点2也是节点0的邻接点。如果我们不对已经遍历过的节点做任何标记,节点2就会再次被遍历,从而让我们陷入死循环。下图的广度优先搜索结果是:2,0,3,1


      下面是用C++实现的一个简单的广度优先搜索。图的存储方式采用的是邻接表,用list容器来保存图中的边,程序中还用到了队列。

程序如下:

//Program to print BFS traversal from a given source vertex. BFS(int s)
//Traverses vertices reachable from s.
#include <iostream>
#include <list>
#include <queue>
using namespace std;

//This class represents a directed graph using adjacency list representation
class Graph
{
private:
	int v;// Number of vertices
	list<int> *adj;//Pointer to an array containing adjacency lists
public:
	Graph(int v);//Constructor
	void addEdge(int v, int w);//function to add an edge to graph
	void BFS(int s);//prints BFS tracersal from a given sources
};

Graph::Graph(int v)
{
	this->v = v;
	adj = new list<int>[v];
}
void Graph::addEdge(int v, int w)
{
	adj[v].push_back(w);//Add w to v's list
}
void Graph::BFS(int s)
{
	//Mark all the vertices as not visited
	bool *visited = new bool[v];
	for(int i = 0; i < v; i++)
	{
		visited[i] = false;
	}
	
	//Create a queue for BFS
	list<int> queue;

	//Mark the current node as visited and enqueue it
	visited[s] = true;
	queue.push_back(s);

	//i will be used to get all adjacent vertices fo a vertex
	list<int>::iterator i;
	while( !queue.empty() )
	{
		//Dequeue a vertex from queue and print it
		s = queue.front();
		cout << s << " ";
		queue.pop_front();

		//Get all adjacent vertices of the dequeued vertex s
		//If a adjacent has not been visited, then mark it visited
		//and enqueue it
		for( i = adj[s].begin(); i != adj[s].end(); i++)
		{
			if( !visited[*i] )
			{
				visited[*i] = true;
				queue.push_back(*i);
			}
		}
	}
	cout << endl;
}


//Driver program to test methonds of graph class
int main(int argc, char* argv[])
{
	//Create a graph given in the above diagram
	Graph g(4);
	g.addEdge( 0, 1);
	g.addEdge( 0, 2);
	g.addEdge( 1, 2);
	g.addEdge( 2, 0);
	g.addEdge( 2, 3);
	g.addEdge( 3, 3);

	cout <<"Followint is Breadth First Travesal( starting from vertex 2 )\n";
	g.BFS(2);
	return 0;
}

输出(下面是以节点2为起点的广度优先搜索的结果):

Following is Breadth First Traversal ( starting from vertex 2)

2 0 3 1

    注意,上面的程序只能遍历从起始节点可达的节点。对于非连通图中的一些不可达的节点则不能遍历到。

原文网址:http://www.geeksforgeeks.org/archives/18382?utm_source=rss&utm_medium=rss&utm_campaign=breadth-first-traversal-for-a-graph

【算法导论】图的广度优先搜索遍历(BFS)

图的存储方法:邻接矩阵、邻接表         例如:有一个图如下所示: 则上图用邻接矩阵可以表示为: 用邻接表可以表示如下: 邻接矩阵可以很容易的用二维数组表示,下面主要看看怎样构成邻接表...
  • tengweitw
  • tengweitw
  • 2013年12月09日 20:50
  • 3069

【经典算法】图的深度优先搜索和广度优先搜索

前面学习了图的邻接表存储,
  • yeswenqian
  • yeswenqian
  • 2014年07月23日 21:41
  • 4654

基于图的深度优先搜索和广度优先搜索java实现

为了解15puzzle问题,了解了一下深度优先搜索和广度优先搜索。先来讨论一下深度优先搜索(DFS),深度优先的目的就是优先搜索距离起始顶点最远的那些路径,而广度优先搜索则是先搜索距离起始顶点最近的那...
  • u011638883
  • u011638883
  • 2013年12月06日 16:49
  • 7269

图的广度优先搜索

  • 2014年05月07日 17:41
  • 53KB
  • 下载

图的广度优先搜索的应用

  • 2013年05月14日 18:52
  • 314KB
  • 下载

TDPL邻接表图的深度优先搜索和广度优先搜索.doc

  • 2015年05月12日 21:38
  • 57KB
  • 下载

邻接表表示的图的深度优先搜索和广度优先搜索程序

  • 2013年06月03日 11:44
  • 20KB
  • 下载

邻接表表示的图的深度优先搜索和广度优先搜索程序

  • 2009年06月28日 15:28
  • 5KB
  • 下载

图的深度优先搜索,广度优先搜索,最小生成树算法,包括kruskal、prim算法的C++实现代码

  • 2016年04月27日 21:04
  • 1.09MB
  • 下载

图的深度优先搜索,广度优先搜索

  • 2011年03月26日 16:07
  • 2.2MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:图的广度优先搜索
举报原因:
原因补充:

(最多只允许输入30个字)