对于BFS的原理在此处就不在讲述,我们直接将具体的实例。
首先是结构为数组的情况下BFS的使用:
int N = 10000;//随意大小
int map[N][N] //图的结构
bool visit[N];//将其初始化为false
void BFS1 (int G[][], int k) //k为你想要遍历的起点
{
int i , j;
queue Q; //建立一个队列
cout << k; //访问kvisited[ k ] = false; //给vk作访问过标记
Q.push(k);//k进队列
while ( ! Q.empty () ) { //队空时搜索结束i=Q.pop(); //vi出队
for(j=0; j<N; j++) { //依次搜索vi的邻接点 j,此处的搜索范围可以看实际的点的数目
if ( G[ i ][ j ] ==1 && !visited[ j ]) { //若j未访问过
cout << j ;//访问vj
visited[ j ]=true; //给vj作访问过标记
Q.push(j) ; //访问过的vj入队
}
} //重复检测 i的所有邻接顶点
} //外层循环,判队列空否
} // 以vk为出发点时对用邻接矩阵表示的图G进行先广搜索
接下来是结构为邻接表的情况:
//首先是数据结构
typedef struct node //边表结点
{
int adjvex; //邻接点域(下标)
int cost; //边上的权值
struct node *next; //下一边链接指针
} EdgeNode;
typedef struct //顶点表结点
{
int vertex; //顶点数据域
EdgeNode * firstedge;//边链表头指针
} VertexNode;
typedef struct //图的邻接表
{
VertexNode vexlist [N];
int n,e; //顶点个数与边数
} AdjGraph;
bool visit[n];//n为顶点个数
void BFS1 (AdjGraph *G, int k)//k为遍历的起点
{
int i;
EdgeNode *p;
queue Q;
cout << G->vexlist[ k ] .vertex;
visit[ k ] = true ;
Q.push(k); //进队列
while ( !Q.empty()) //队空搜索结束
{
i=Q.pop(); //i出队
p =G->vexlist[ i ].firstedge; //取i的边表头指针
while ( p ) //若i的邻接点j
{
if ( !visit[ p->adjvex ]) //若j未访问过
{
cout << G->vexlist[ p->adjvex ].vertex; //访问j
visit[ p->adjvex ]=true; //给j作访问过标记
Q.push(p->adjvex); //访问过的j入队
}
p = p->next; //找vi的下一个邻接点
} / / 重复检测 vi的所有邻接顶点
} //外层循环,判队列空否
}//以k为出发点时对用邻接表表示的图G进行先广搜索
以上就是BFS在两种不同的数据结构下的基本使用。