图的广度优先搜索

翻译 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

相关文章推荐

图的广度优先搜索

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

图的广度优先搜索的应用

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

图之广度优先搜索

广度优先搜索算法及其Java实现

广度优先搜索,图的遍历

1、 队列 (1)      定义     队列也是一种运算受限的线性表。在这种线性表上,插入限定在表的某一端进行,删除限定在表的另一端进行。允许插入的一端称为队尾,允许删除的一端称为队头。  ...

图:广度优先搜索(Breadth_First Search)

广度优先搜索(Breadth_first Search):假设从图中的顶点v出发,在访问了v之后依次访问v的各个为曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使“先被访问的顶点的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:图的广度优先搜索
举报原因:
原因补充:

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