淺談圖的廣度優先遍歷


一、廣度優先遍歷

上次我們淺談了圖的深度優先遍歷,接下來我們使用廣度優先搜索來遍歷這個圖:

這五個頂點被訪問的順序如下圖所示:

 

二、實現過程

廣度優先搜索過程如下:

  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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM