演算法7-4,7-5:圖的遍歷——深度優先搜尋
阿新 • • 發佈:2019-01-09
題目描述
深度優先搜尋遍歷類似於樹的先根遍歷,是樹的先根遍歷的推廣。其過程為:假設初始狀態是圖中所有頂點未曾被訪問,則深度優先搜尋可以從圖中的某個頂點v出發,訪問此頂點,然後依次從v的未被訪問的鄰接點出發深度優先遍歷圖,直至圖中所有和v有路徑相通的頂點都被訪問到;若此時圖中尚有頂點未被訪問,則另選圖中一個未曾被訪問的頂點作為起始點,重複上述過程,直至圖中所有頂點都被訪問到為止。 其演算法可以描述如下: 在本題中,讀入一個無向圖的鄰接矩陣(即陣列表示),建立無向圖並按照以上描述中的演算法遍歷所有頂點,輸出遍歷頂點的順序。輸入
輸入的第一行包含一個正整數n,表示圖中共有n個頂點。其中n不超過50。 以後的n行中每行有n個用空格隔開的整數0或1,對於第i行的第j個0或1,1表示第i個頂點和第j個頂點有直接連線,0表示沒有直接連線。當i和j相等的時候,保證對應的整數為0。 輸入保證鄰接矩陣為對稱矩陣,即輸入的圖一定是無向圖。輸出
樣例輸入
4
0 1 0 1
1 0 0 0
0 0 0 1
1 0 1 0
樣例輸出
0 1 3 2
提示
在本題中,需要熟練掌握圖的鄰接矩陣儲存方式。在建立完成無向圖之後,需要嚴格按照題目描述的遍歷順序對圖進行遍歷。另外,演算法中描述的FirstAdjVex函式和NextAdjVex函式,需要認真的自行探索並完成。通過這道題目,應該能夠對圖的深度優先搜尋建立更加直觀和清晰的概念。
題意描述:
1表示第i個頂點和第j個頂點有直接連線,0表示沒有直接連線,輸出從0到n的遍歷順序。
思路:
利用深度搜索把輸入讀入一個二維陣列中,依次輸出所遍歷的點。
具體程式碼:
#include<stdio.h> int e[60][60],book[60]; int sum,n; void dfs(int cur) { int i; printf("%d ",cur); sum++; if(sum == n) return; for(i = 0;i < n; i ++) { if(e[cur][i] == 1 &&book[i] == 0) { book[i] = 1; dfs(i); } } return; } int main() { int i,j,k; scanf("%d",&n); for(i = 0;i < n;i ++) for(j = 0;j < n;j ++) { if(i==j) e[i][j]=0; else e[i][j]=99999999; } for(i = 0;i < n;i ++) for(j = 0;j < n;j ++) { scanf("%d",&k); e[i][j]=k; } book[0]=1; dfs(0); return 0; }