原理:
逐层搜索图中的所有顶点,且保证所有顶点只被访问依次。
具体过程:
从图中某个顶点v出发,访问该顶点后,依次访问所有未被访问过的v的邻接顶点,然后再沿着这些顶点出发,依次访问它们未被访问过的邻接顶点,并且保证先被访问顶点的邻接顶点先于后被访问顶点的邻接顶点而被访问。所有与v有相通路径的顶点都被访问结束后,如果图中还有未被访问的顶点,则从这些顶点出发,重复上述过程,直到图中所有顶点都被访问过。
//数组visited[]等于0表示该顶点还未访问过,等于1表示已访问
//函数Visit()表示访问该顶点
int visited[N];
void BFSSearch(Graph G)
{
int i, v;
for (i = 0;i < G.vexnum;++i)
visited[i] = 0;
//创建并初始化一个队列
InitQueue(Q);
for (v = 0;v < G.vexnum;++v)
{
//依次访问每个顶点,若该顶点未访问过则相应的visit[]置1且存入队列中
if (!visited[v])
{
visited[v] = 1;
Visit(v);
EnQueue(Q, v);
//当队列不为空时
while (!QueueEmpty(Q))
{
//弹出队列首元素
deQueue(Q, u);
//函数FirstAdjVex(G,u)返回顶点u的第一个邻接点,NextAdjVex返回u的(相对于w)的下一个邻接点
//若w是v的最后一个邻接点则返回空
for (w = FirstAdjVex(G, u);w >= 0;w = NextAdjVex(G, u, w))
{
//若结点未被访问过则visit[]置1并存入队列
if (!visited[w])
{
visited[w] = 0;
Visit(w);
EnQueue(Q, w);
}
}
}
}
}
}