Fork me on GitHub
打赏

浅谈图的广度优先遍历

一、广度优先遍历

上次我们浅谈了图的深度优先遍历,接下来我们使用广度优先搜索来遍历这个图:

这五个顶点被访问的顺序如下图所示:

 

二、实现过程

广度优先搜索过程如下:

  1. 首先以一个未被访问过的顶点作为起始顶点,比如以1号顶点为起点。
  2. 将1号顶点放入到队列中,然后将与1号顶点相邻的未访问过的顶点,即2号、3号和5号顶点依次放入到队列中。
  3. 接下来再将2号顶点相邻的未访问过的4号顶点放入到队列中。
  4. 到此所有顶点都被访问过,遍历结束。

广度优先遍历的主要思想:

  1. 首先以一个未被访问过的顶点作为起始顶点,访问其所有相邻的顶点;
  2. 然后对每个相邻的顶点,再访问它们相邻的未被访问过的顶点;
  3. 直到所有顶点都被访问过,遍历结束。

三、完整代码如下

#include<stdio.h>
int main()
{
    int i,j,n,m,a,b,cur,book[101]={0},e[101][101];
    int que[10001],head,tail;
    scanf("%d %d",&n,&m);
    //初始化二维矩阵
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            if(i==j) e[i][j]=0;
            else e[i][j]=99999999;  //表示正无穷
            
    //读入顶点之间的边
    for(i=1;i<=m;i++)
    {
        scanf("%d %d",&a,&b);
        e[a][b]=1;
        e[b][a]=1; 
     } 
     
    //队列初始化
    head=1;
    tail=1;
    
    //从1号顶点出发,将1号顶点加入队列
    que[tail]=1;
    tail++;
    book[1]=1;  //标记1号顶点已访问 
    
    //当队列不为空时循环 
    while(head<tail && tail<=n)
    {
        cur=que[head];  //当前正在访问的顶点编号
        for(i=1;i<=n;i++)  //从1~n依次尝试
        {
            //判断从顶点cur到顶点i是否有边,并且顶点i没有被访问过,则将顶点i入队
            if(e[cur][i]==1 && book[i]==0){
                que[tail]=i;
                tail++;
                book[i]=1;  //标记顶点i已访问                 
            }
            //如果tail大于n,则表明所有顶点都已经被访问过
            if(tail>n)
            {
                break;
             } 
         } 
        head++;  //当一个顶点扩展结束后,执行head++才能继续往下扩展 
     } 
    
    for(i=1;i<tail;i++)
        printf("%d ",que[i]);
        
    getchar();getchar();
    return 0;
}

 

posted @ 2018-01-12 18:33  Zoctopus_Zhang  阅读(2176)  评论(0编辑  收藏  举报
// function btn_donateClick() { var DivPopup = document.getElementById('Div_popup'); var DivMasklayer = document.getElementById('div_masklayer'); DivMasklayer.style.display = 'block'; DivPopup.style.display = 'block'; var h = Div_popup.clientHeight; with (Div_popup.style) { marginTop = -h / 2 + 'px'; } } function MasklayerClick() { var masklayer = document.getElementById('div_masklayer'); var divImg = document.getElementById("Div_popup"); masklayer.style.display = "none"; divImg.style.display = "none"; } setTimeout( function () { document.getElementById('div_masklayer').onclick = MasklayerClick; document.getElementById('btn_donate').onclick = btn_donateClick; var a_gzw = document.getElementById("guanzhuwo"); a_gzw.href = "javascript:void(0);"; $("#guanzhuwo").attr("onclick","follow('33513f9f-ba13-e011-ac81-842b2b196315');"); }, 900);