1. 程式人生 > >1762: 圖的遍歷——深度優先搜索

1762: 圖的遍歷——深度優先搜索

include 使用 連接 最好 pre return 裏的 pan 函數參數傳遞

題目描述

深度優先搜索遍歷類似於樹的先根遍歷,是樹的先根遍歷的推廣。其過程為:假設初始狀態是圖中所有頂點未曾被訪問,則深度優先搜索可以從圖中的某個頂點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 

 1 #include<stdio.h>
 2 const int maxn=100;
 3 bool visted[maxn];
 4 int G[maxn][maxn]={0};//註意這裏的數組定義在最前面是最好的,可以在任意函數模塊直接使用 
 5 void DFS(int v,int n){//因為二維數組作為函數參數傳遞會比較麻煩 
 6     printf("
%d ",v); 7 int w; 8 visted[v]=true; 9 for(w=0;w<n;w++){ 10 if(G[v][w]==1 && visted[w]==false){//訪問目前節點的相鄰節點,如果節點存在邊並且沒有被訪問,那麽遞歸DFS 11 DFS(w,n); 12 } 13 } 14 } 15 void DFSTraverse(int n){ 16 for(int i=0;i<n;i++){ 17 visted[i]=false;
18 } 19 int k; 20 for(k=0;k<n;k++){//遍歷每個頂點,如果沒有被訪問,那麽就可以DFS 21 if(!visted[k]){ 22 DFS(k,n); 23 } 24 } 25 } 26 int main(){ 27 int n; 28 scanf("%d",&n); 29 for(int i=0;i<n;i++){ 30 for(int j=0;j<n;j++){ 31 scanf("%d",&G[i][j]); 32 } 33 } 34 DFSTraverse(n); 35 return 0; 36 }

Mist筆記:理解DFS算法,然後模仿去自己寫,寫這個程序遇到一個小的卡殼,二維數組一開始定義在了main函數裏,這樣有個問題無法解決,就是其他函數調用這個數組怎麽辦?二維數組傳參我沒發現好方法,所以正確的思路是定義在main外,這樣就可以在任何函數模塊直接調用了。

1762: 圖的遍歷——深度優先搜索