#include "pch.h"
#include "__0 Basic_operation.h"
#include <iostream>
#include <deque>
#include <vector>
/*邻接矩阵的广度优先遍历算法*/
void BFSTraverse(const MGraph& G) {
std::deque<int> myDeque; //存储已处理的顶点,便于之后处理与他相邻的顶点
std::vector<bool> visited(G.numVertexes, false); //初始化所有顶点都是未访问过状态
/*对每一个顶点做一次循环*/
for (int i = 0; i < G.numVertexes; ++i)
{
/*每次一进入就会处理完一个最大连通子图*/
if (!visited[i])
{
visited[i] = true;
std::cout << G.vexs[i] << " "; //访问顶点信息
myDeque.push_back(i); //将此顶点入队列
while (!myDeque.empty()) { //当前队列不为空
i = myDeque.front(); //将队头元素赋值给i,队头出队列
myDeque.pop_front();
/*判断其他顶点若与当前顶点存在边且未访问过*/
for (int j = 0; j < G.numVertexes; ++j)
if (G.arcs[i][j] != 0 && G.arcs[i][j] < myINFINITY && !visited[j])
{
visited[j] = true;
std::cout << G.vexs[j] << " ";
myDeque.push_back(j); //将找到的此节点入队列
}
}
}
}
}
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 表示无向图
ShowMGraph(G);
std::cout << "\n广度优先遍历结果:";
BFSTraverse(G);
std::cout << std::endl << std::endl;
return 0;
}
__3.5.3 广度优先遍历邻接矩阵
猜你喜欢
转载自blog.csdn.net/qq_40843865/article/details/89225037
今日推荐
周排行