1. 程式人生 > >圖的深度優先遍歷(DFS)和廣度優先遍歷(BFS)算法分析

圖的深度優先遍歷(DFS)和廣度優先遍歷(BFS)算法分析

search 圖的深度優先遍歷 eight 一個 ima 圖的廣度優先遍歷 spa color 一句話

1. 深度優先遍歷

  深度優先遍歷(Depth First Search)的主要思想是:

    1、首先以一個未被訪問過的頂點作為起始頂點,沿當前頂點的邊走到未訪問過的頂點;

    2、當沒有未訪問過的頂點時,則回到上一個頂點,繼續試探別的頂點,直至所有的頂點都被訪問過。

   在此我想用一句話來形容 “不到南墻不回頭”。

  1.1 無向圖的深度優先遍歷圖解

以下"無向圖"為例:

技術分享圖片

 對上無向圖進行深度優先遍歷,從A開始:

第1步:訪問A。

第2步:訪問B(A的鄰接點)。 在第1步訪問A之後,接下來應該訪問的是A的鄰接點,即"B,D,F"中的一個。但在本文的實現中,頂點ABCDEFGH是按照順序存儲,B在"D和F"的前面,因此,先訪問B。

第3步:訪問G(B的鄰接點)。 和B相連只有"G"(A已經訪問過了)

第4步:訪問E(G的鄰接點)。 在第3步訪問了B的鄰接點G之後,接下來應該訪問G的鄰接點,即"E和H"中一個(B已經被訪問過,就不算在內)。而由於E在H之前,先訪問E。

第5步:訪問C(E的鄰接點)。 和E相連只有"C"(G已經訪問過了)。

第6步:訪問D(C的鄰接點)。

第7步:訪問H。因為D沒有未被訪問的鄰接點;因此,一直回溯到訪問G的另一個鄰接點H。

第8步:訪問(H的鄰接點)F。

因此訪問順序是:A -> B -> G -> E -> C -> D -> H

-> F

  1.2 有向圖的深度優先遍歷

有向圖的深度優先遍歷圖解:

技術分享圖片

對上有向圖進行深度優先遍歷,從A開始:

第1步:訪問A。

第2步:訪問(A的出度對應的字母)B。 在第1步訪問A之後,接下來應該訪問的是A的出度對應字母,即"B,C,F"中的一個。但在本文的實現中,頂點ABCDEFGH是按照順序存儲,B在"C和F"的前面,因此,先訪問B。

第3步:訪問(B的出度對應的字母)F。 B的出度對應字母只有F。

第4步:訪問H(F的出度對應的字母)。 F的出度對應字母只有H。

第5步:訪問(H的出度對應的字母)G。

第6步:訪問(G的出度對應字母)E。 在第5步訪問G之後,接下來應該訪問的是G的出度對應字母,即"B,C,E"中的一個。但在本文的實現中,頂點B已經訪問了,由於C在E前面,所以先訪問C。

第7步:訪問(C的出度對應的字母)D。

第8步:訪問(C的出度對應字母)D。 在第7步訪問C之後,接下來應該訪問的是C的出度對應字母,即"B,D"中的一個。但在本文的實現中,頂點B已經訪問了,所以訪問D。

第9步:訪問E。D無出度,所以一直回溯到G對應的另一個出度E。

因此訪問順序是:A -> B -> F -> H -> G -> C -> D -> E

2.廣度優先遍歷

 廣度優先遍歷(Depth First Search)的主要思想是:類似於樹的層序遍歷。

  2.1 無向圖的廣度優先遍歷圖解:

技術分享圖片

從A開始,有4個鄰接點,“B,C,D,F”,這是第二層;

在分別從B,C,D,F開始找他們的鄰接點,為第三層。以此類推。

技術分享圖片

因此訪問順序是:A -> B -> C -> D -> F -> G -> E -> H

  2.2 有向圖的廣度優先遍歷圖解:

技術分享圖片

與無向圖類似 。可以參考。

技術分享圖片

因此訪問順序是:A -> B -> C -> F -> D -> H -> E -> G

沒有貼代碼,需要可以給博主私哦。

PS:打字不易,轉載請說明出處。

圖的深度優先遍歷(DFS)和廣度優先遍歷(BFS)算法分析