数组和邻接表的BFS基础用法

对于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; //访问k

visited[ 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在两种不同的数据结构下的基本使用。

猜你喜欢

转载自blog.csdn.net/qq_36719861/article/details/79428301