广度优先遍历主要思想:首先以一个未被访问的顶点作为起点,访问其所有相邻的顶点;然后对每个相邻的顶点,再访问他们相邻的未被访问的顶点,直到所有顶点被访问过。
遍历图,输出遍历顺序
#include<iostream>
using namespace std;
int e[50][50],book[50];
int n,m;
int main()
{
int a,b,c;
int que[2501];
int head,tail;
cin>>n>>m;
//输入一个n行n列的数组
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==j)
e[i][j]=0;
else
e[i][j]=99999999;
}
}
//输入m个连通边
for(int i=1;i<=m;i++)
{
cin>>a>>b;
e[a][b]=1;
}
//队列初始化
head=1;
tail=1;
//将第一个顶点加入队列,并做好标记
que[tail]=1;
tail++;
book[1]=1;
while(head<tail&&tail<=n)
{
c=que[head]; //c为当前正在访问的顶点编号,下面遍历访问顶点所在的行
for(int i=1;i<=n;i++)
{
if(e[c][i]==1&&book[i]==0)
{
que[tail]=i;
tail++;
book[i]=1;
}
//若所有顶点都被访问完,则跳出循环
if(tail>n)
{
break;
}
}
//该顶点被访问完,head++表示继续访问下一个顶点
head++;
}
//注意tail最后指向是队列最后一个元素位置+1,所以i<tail或i<=tail-1
for(int i=1;i<tail;i++)
{
cout<<que[i]<<" ";
}
return 0;
}
//注意每次遍历新的一行时,book数组是没有改变的,在,c行前若变为1,即顶点i就已经被访问
// 后面再访问该列时,就不符合book[i]=0,不进入循环;