(bfs)广度优先 实现图的遍历

参考书:
《啊哈算法第五章:图的遍历》
《第一节。深度优先和广度优先究竟是啥》——广度优先 实现图的遍历
广度优先算法实现图的遍历代码如下:

#include <iostream>

using namespace std;

int book[101], n = 5, e[101][101];   //n为顶点个数
int que[10001], cur=1, head=1, tail=1;

void bfs(int cur)   //广度优先搜索
{
    while(head<tail)
    {
        cur = que[head];  //当前正在访问的顶点编号
        for(int i=1;i<=n;i++)
        {
            //判断当前顶点cur与顶点i是否有边相连,并判断顶点i 是否已经访问过
            if(e[cur][i]==1&&book[i]==0)
            {
                que[tail]=i;
                tail++;
                book[i]=1;  //标记顶点i已经访问过
            }
            if(tail>n)
                break;
        }
        head++;  //一个顶点扩展结束后,才head++。然后继续往下扩展。
    }
    return;
}

void myPrint(int que[])
{
    for(int i=1;i<tail;i++)
    {
        cout<<que[i]<<" ";
    }
}
int main()
{
    //定义一个二维数组表示顶点之间边
    int bian[5][2]={{1,2},{1,3},{1,5},{2,4},{3,5}};  //边的个数
    int num=sizeof(bian)/sizeof(bian[0]);  //边的个数

    //初始化二维矩阵e
    for(int i=1;i<=num;i++)
    {
        for(int j=1;j<=num;j++)
        {
            if(i==j)
                e[i][j]=0;
            else
                e[i][j]=99999999;
        }
    }

    for(int i=1;i<=num;i++)
    {
        e[bian[i-1][0]][bian[i-1][1]]=1;
        e[bian[i-1][1]][bian[i-1][0]]=1;
    }

    //从1号顶点出发,将1号顶点加入队列。
    que[tail]=1;
    tail++;
    book[1]=1;

   // int cur=1;
    bfs(cur);
    myPrint(que);
    cout<<endl;

    system("pause");


    return 0;
}

运行结果:

1 2 3 5 4
请按任意键继续. . .
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页