1. 程式人生 > >演算法7-6:圖的遍歷——廣度優先搜尋(c語言)

演算法7-6:圖的遍歷——廣度優先搜尋(c語言)

[提交] [統計] [提問]

題目描述

廣度優先搜尋遍歷類似於樹的按層次遍歷的過程。其過程為:假設從圖中的某頂點v出發,在訪問了v之後依次訪問v的各個未曾被訪問過的鄰接點,然後分別從這些鄰接點出發依次訪問它們的鄰接點,並使“先被訪問的頂點的鄰接點”先於“後被訪問的頂點的鄰接點”被訪問,直至圖中所有已被訪問的頂點的鄰接點都被訪問到。若此時圖中尚有頂點未被訪問,則另選圖中一個未曾被訪問的頂點作為起始點。重複上述過程,直至圖中所有頂點都被訪問到為止。

其演算法可以描述如下:

在本題中,讀入一個無向圖的鄰接矩陣(即陣列表示),建立無向圖並按照以上描述中的演算法遍歷所有頂點,輸出遍歷頂點的順序。

輸入描述

輸入的第一行包含一個正整數n,表示圖中共有n個頂點。其中n不超過50。

以後的n行中每行有n個用空格隔開的整數0或1,對於第i行的第j個0或1,1表示第i個頂點和第j個頂點有直接連線,0表示沒有直接連線。當i和j相等的時候,保證對應的整數為0。

輸入保證鄰接矩陣為對稱矩陣,即輸入的圖一定是無向圖。

輸出描述

只有一行,包含n個整數,表示按照題目描述中的廣度優先遍歷演算法遍歷整個圖的訪問頂點順序。每個整數後輸出一個空格,並請注意行尾輸出換行。

輸入樣例
4
0 0 0 1
0 0 1 1
0 1 0 1
1 1 1 0

輸出樣例
0 3 1 2

 
 //這題是用一個數組代替佇列水過的
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int n, k, l;
int a[55][55];
int b[55];
int ans[55];

void DFS(int x)
{

    int i, j;
    if(b[x] == 1)
    {
        ans[k++] = x;
        b[x] = 0;
    }

   if(k == n)
    {
        for(i = 0; i < n; i++)
        {

            printf("%d ", ans[i]);
        }
        printf("\n");
        exit(0);
    }
   for(i = 0; i < n; i++)
   {
       if(a[x][i] == 1 && b[i] == 1)
       {
           ans[k++] = i;
           b[i] = 0;
       }
   }
   DFS(ans[++l]);
   return ;
}

int main()
{
    int i, j;
    scanf("%d", &n);
    {
        for(i = 0; i < n; i++)
        {
            for(j = 0; j < n; j++)
            {
                scanf("%d", &a[i][j]);

            }
        }
        k = 0;
        l = 0;
        for(j = 0; j < n; j++)
            b[j] = 1;
        for(i = 0; i < n; i++)
        {
            if(b[i] == 1)
            {
                DFS(i);
            }

        }

    }
    return 0;
}