/*
名称:广度优先遍历
说明:广度优先遍历类似于树中的层次遍历,所以其需要使用到一个辅助的队列,用来保存接下来要访问的顶点顺序。其空间复杂度最高为O(V)。
其次,对于广度的优先遍历来说,其主要的时间也是花在访问当前结点的下一个结点上,所以对于用临接矩阵存储结构的图来说,其时间复杂度为O(V2)。对于临接表来说,时间复杂度为O(V+E)。
具体的算法采用两种方式都都差不多,此处之敲了以临接矩阵的图的广度优先遍历。
*/
#include<iostream>
#include<queue>
#include "graph.h"
using namespace std;
//访问标志数组
bool visited1[MaxVertexNum];
queue<int> Q; //辅助队列Q
//广度优先遍历(采用临接矩阵结构)
void BFS1(MGraph G,int v)
{
int val = -1;
cout<<GetVex1(G,v)<<" "; //访问输出v顶点
visited1[v] = true; //对v做已访问标记
Q.push(v); //顶点v入队列
while(Q.empty() == false)
{
val = Q.front(); //获得队首的顶点
Q.pop(); //出队
for(int w = FirstNeighbor1(G,val); w >= 0; w = NextNeighbor1(G,val,w))
{
if(visited1[w] == false)
{
cout<<GetVex1(G,w)<<" "; //访问顶点
visited1[w] = true; //做已访问标记
Q.push(w);
}
}
}
}
//总的广度优先遍历(采用临接矩阵结构)
void BFSTraverse1(MGraph G)
{
//初始化标记数组
for(int i = 0;i<G.vexnum;++i)
{
visited1[i] = false;
}
for(int i = 0;i<G.vexnum;++i)
{
if(visited1[i] == false)
{
BFS1(G,i); //从i结点开始访问
}
}
}