演算法7-6:圖的遍歷——廣度優先搜尋
阿新 • • 發佈:2018-11-05
http://www.dotcpp.com/oj/problem1703.html
題目描述
廣度優先搜尋遍歷類似於樹的按層次遍歷的過程。其過程為:假設從圖中的某頂點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
提示
在本題中,需要熟練掌握圖的鄰接矩陣儲存方式。在建立完成無向圖之後,需要嚴格按照題目描述的遍歷順序對圖進行遍歷。另外,演算法中描述的FirstAdjVex函式和NextAdjVex函式,需要認真的自行探索並完成。在本題中需要使用佇列結構,需要對佇列的概念進行復習。
通過這道題目,應該能夠對圖的廣度優先搜尋建立更加直觀和清晰的概念。
#include<stdio.h> #define N 120 int a[N][N],book[N],arr[N*N]; int main() { int n,head,tail,i,j; scanf("%d",&n); for(i=0;i<n;i++) for(j=0;j<n;j++) scanf("%d",&a[i][j]); head=tail=0; book[0]=1; arr[tail]=0; tail++; printf("0 "); while(head<tail) { for(i=0;i<n;i++) if(book[i]==0&&a[arr[head]][i]==1) { book[i]=1; printf("%d ",i); arr[tail]=i; tail++; } head++; } printf("\n"); return 0; }