Bootstrap

数据结构——图的遍历(DFS、BFS)

//(基于邻接表实现,以有向图为例)
//DFS:Depth First Search 深度优先搜索
//1、访问起始顶点  2、访问一个未访问过的邻接顶点 3、若所有邻接顶点都已被访问,则回溯 4、所有顶点都被访问,遍历结束
void dfs(int start, bool visited[])
{
	//访问起始结点
	cout << verList[start].ver << '\t';
	visited[start] = true;
	//找到顶点表中该顶点对应的链表
	edgeNode* node = verList[start].head;
	while (node)
	{
		if (!visited[node]) dfs(visited[node],visited); //访问未访问过的邻接结点
	    node = node->next; //跳过已访问的结点
	}
	//当所有邻接结点都已被访问,则回溯
}  //递归函数结束时,生成一棵深度优先搜索树

void dfs()
{
   //访问标志数组初始化
	bool* visited=new bool[Vers];  //Vers:顶点数量
	for (int i = 0; i < Vers; i++)
		Vers[i] = false;
	for (int i = 0; i < Vers; i++)
	{
		if (visited[i] == true) continue; //寻找下一个树遍历的起始结点
		dfs(i, visited);
	} //生成深度优先搜索森林(起点选择不同,生成结果不同,有些情况能只生成一棵树)
}

//BFS:Breadth First Search 广度优先搜索
//1、访问起始顶点 2、依次访问起始顶点的所有未访问的邻接结点  3、所有顶点都被访问,遍历结束
void bfs()
{
	queue<int>  q;
	bool* visited = new bool[Vers];
	for (int i = 0; i < Vers; i++)
		visited[i] = false;
	for (int i = 0; i < Vers; i++)
	{
		if (visited[Vers] == true)  continue;  ///寻找一棵新的搜索树的起始结点
		q.push(i);  //结点入队,开始一棵搜索树的生成
		while (!q.empty())
		{
			int currentNode = q.front();
			q.pop();
			if (visited[currentNode])  continue; //这里需要注意,比如1的邻接结点2、3入队,而3邻接于2,在访问3的过程中已访问了2,所以2出队时无需再次访问
			cout << verList[currentNode].ver << '\t'; //访问当前结点
			visited[currentNode] = true;
			//找到顶点表中该顶点对应的链表
			edgeNode* node = verList[currentNode].head;
			//将未访问的邻接顶点入队
			while (node)
			{
				if (!visited[node->end]) q.push(node->end); //将未访问的邻接顶点入队
				node = node->next;
			}  
		}
	}
}

;