演算法7-4:圖的遍歷——深度優先搜尋(模板)
阿新 • • 發佈:2018-12-16
題目描述 深度優先搜尋遍歷類似於樹的先根遍歷,是樹的先根遍歷的推廣。其過程為:假設初始狀態是圖中所有頂點未曾被訪問,則深度優先搜尋可以從圖中的某個頂點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 1 0 1 1 0 0 0 0 0 0 1 1 0 1 0
樣例輸出
0 1 3 2
提示 在本題中,需要熟練掌握圖的鄰接矩陣儲存方式。在建立完成無向圖之後,需要嚴格按照題目描述的遍歷順序對圖進行遍歷。另外,演算法中描述的FirstAdjVex函式和NextAdjVex函式,需要認真的自行探索並完成。 通過這道題目,應該能夠對圖的深度優先搜尋建立更加直觀和清晰的概念。
#include<stdio.h> int n,e[55][55],book[55]; void dfs(int s) { int i,k=0; printf("%d ",s); k ++; if(k == n) return ; for(i = 0; i < n; i ++) { if(book[i] == 0 && e[s][i] == 1) { book[i] = 1; dfs(i); } } return ; } int main() { int i,j; scanf("%d",&n); for(i = 0; i < n; i ++) for(j = 0; j < n; j ++) scanf("%d",&e[i][j]); book[0] = 1; dfs(0); printf("\n"); return 0; }