深度優先遍歷
假設給定圖G的初態是所有頂點均未曾訪問過。在G中任選一頂點v為初始出發點(源點),則深度優先遍歷可定義如下:首先訪問出發點v,並將其標記為已訪問過;然后依次從v出發搜索v的每個鄰接點w。若w未曾訪問過,則以w為新的出發點繼續進行深度優先遍歷,直至圖中所有和源點v有路徑相通的頂點(亦稱為從源點可達的頂點)均已被訪問為止。若此時圖中仍有未訪問的頂點,則另選一個尚未訪問的頂點作為新的源點重復上述過程,直至圖中所有頂點均已被訪問為止。
圖的深度優先遍歷類似於樹的前序遍歷。采用的搜索方法的特點是盡可能先對縱深方向進行搜索。這種搜索方法稱為深度優先搜索(Depth-First Search)。相應地,用此方法遍歷圖就很自然地稱之為圖的深度優先遍歷。
說白了深度優先遍歷就是一種不撞南牆不會頭的算法,他會把一條路走完之后再回溯到有分叉的節點繼續遍歷。
如圖:
- 首先標記點0,然后按字典序尋找未標記的相鄰點進行遍歷(點1)。
- 標記點1,按字典序尋找未標記的相鄰點繼續遍歷(點4)。
- 同步驟2,直到遍歷到點3,因為與他相鄰的點(點0,點6)都被標記過,所以回溯到點6,繼續尋找點6的未標記的相鄰點繼續遍歷(點7)。
- 標記點7,同步驟3,回溯點6。
- 這時點6的所有相鄰點都被標記,回溯點4。
- 同步驟5,繼續回溯到點1。
- 按字典序尋找點1的未標記的相鄰點繼續遍歷(點2)。
- 同步驟2,遍歷點5。
- 同步驟5,回溯到點0,此時整個圖的點都被遍歷過,結束。
遍歷結果 01463725
例題:數據結構實驗之圖論二:圖的深度遍歷
廣度優先遍歷
- 從圖中某個頂點V0出發,並訪問此頂點;
- 從V0出發,訪問V0的各個未曾訪問的鄰接點W1,W2,…,Wk;然后,依次從W1,W2,…,Wk出發訪問各自未被訪問的鄰接點;
- 重復步驟2,直到全部頂點都被訪問為止。
這是一種層層遞進的算法,與樹的層序遍歷類似。
在廣度優先搜索時,會從起點開始“一層一層”擴展的方法來遍歷,擴展時每發現一個點就將這個點加入到隊列,直到整張圖都被遍歷過位置。