__3.5.4 广度优先遍历邻接表

#include "pch.h"
#include "__0 Basic_operation.h"
#include <iostream>
#include <deque>
#include <vector>


/*邻接矩阵的广度优先遍历算法*/
void BFSTraverse(const GraphAdjList& GL) {
	std::deque<int> myDeque;		//存储已处理的顶点,便于之后处理与他相邻的顶点
	std::vector<bool> visited(GL.numVertexes, false);  //初始化所有顶点都是未访问过状态

	for (int i = 0; i < GL.numVertexes; ++i)
	{
		/*每次一进入就会处理完一个最大连通子图*/
		if (!visited[i]) {
			visited[i] = true;
			std::cout << GL.adjlist[i].data << " ";	 //访问顶点信息
			myDeque.push_back(i);			 //将此顶点入队列

			while (!myDeque.empty()) {	//当前队列不为空
				i = myDeque.front();	//将队头元素赋值给i,队头出队列
				myDeque.pop_front();

				auto p = GL.adjlist[i].firstEdge;
				while (p) {
					if (!visited[p->adjvex]) {
						visited[p->adjvex] = true;
						std::cout << GL.adjlist[p->adjvex].data << " ";
						myDeque.push_back(p->adjvex);		//将此顶点入队列
					}
					p = p->next;
				}
			}
		}
	}
}


int main() {
	/*  P242无向图				  0  1  2  3  4  5  6  7  8  */
	vector<vector<EdgeType>> vv{ {0, 1, N, N, N, 1, N, N, N},
								 {1, 0, 1, N, N, N, 1, N, 1},
								 {N, 1, 0, 1, N, N, N, N, 1},
								 {N, N, 1, 0, 1, N, 1, 1, 1},
								 {N, N, N, 1, 0, 1, N, 1, N},
								 {1, N, N, N, 1, 0, 1, N, N},
								 {N, 1, N, 1, N, 1, 0, 1, N},
								 {N, N, N, 1, 1, N, 1, 0, N},
								 {N, 1, 1, 1, N, N, N, N, 0} };
	MGraph G;
	CreateMGraphByArray(G, vv, 0);	//传入 0 表示无向图
	
	GraphAdjList GL;
	CreateAdjListByMGraph(GL, G);
	ShowAdjList(GL);

	std::cout << "\n广度优先遍历结果:";
	BFSTraverse(GL);
	std::cout << std::endl << std::endl;

	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40843865/article/details/89225044