DFS 深搜 演算法解析

2021-08-19 08:50:08 字數 2656 閱讀 8945

圖是一種靈活的資料結構,一般作為一種模型用來定義物件之間的關係或聯絡。物件由頂點(v)表示,而物件之間的關係或者關聯則通過圖的邊(e)來表示。 圖可以分為有向圖和無向圖,一般用g=(v,e)來表示圖。經常用鄰接矩陣或者鄰接表來描述一副圖。 在圖的基本演算法中,最初需要接觸的就是圖的遍歷演算法,根據訪問節點的順序,可分為廣度優先搜尋(bfs)和深度優先搜尋(dfs)。

廣度優先搜尋(bfs) 廣度優先搜尋在進一步遍歷圖中頂點之前,先訪問當前頂點的所有鄰接結點。 a .首先選擇乙個頂點作為起始結點,並將其染成灰色,其餘結點為白色。 b. 將起始結點放入佇列中。 c. 從佇列首部選出乙個頂點,並找出所有與之鄰接的結點,將找到的鄰接結點放入佇列尾部,將已訪問過結點塗成黑色,沒訪問過的結點是白色。如果頂點的顏色是灰色,表示已經發現並且放入了佇列,如果頂點的顏色是白色,表示還沒有發現 d. 按照同樣的方法處理佇列中的下乙個結點。 基本就是出隊的頂點變成黑色,在佇列裡的是灰色,還沒入隊的是白色。 用一副圖來表達這個流程如下:

1.初始狀態,從頂點1開始,佇列=

2.訪問1的鄰接頂點,1出隊變黑,2,3入隊,佇列=

3.訪問2的鄰接結點,2出隊,4入隊,佇列=

4.訪問3的鄰接結點,3出隊,佇列=

5.訪問4的鄰接結點,4出隊,佇列=

從頂點1開始進行廣度優先搜尋:

初始狀態,從頂點1開始,佇列=

訪問1的鄰接頂點,1出隊變黑,2,3入隊,佇列=

訪問2的鄰接結點,2出隊,4入隊,佇列=

訪問3的鄰接結點,3出隊,佇列=

訪問4的鄰接結點,4出隊,佇列= 結點5對於1來說不可達。 上面的圖可以通過如下鄰接矩陣表示:

1

int maze[5][5] =,

3 ,

4 ,

5 ,

6

7 };

bfs核心**如下:

1 #include 2 #include 3

#define n 5

4using

namespace

std;

5int maze[n][n] =,

7 ,

8 ,

9 ,

10

11};

12int visited[n + 1] = ;

13void bfs(int

start)

1430}31

}32}33

intmain()

3441

return0;

42 }

1.初始狀態,從頂點1開始

2.依次訪問過頂點1,2,3後,終止於頂點3

3.從頂點3回溯到頂點2,繼續訪問頂點5,並且終止於頂點5

4.從頂點5回溯到頂點2,並且終止於頂點2

5.從頂點2回溯到頂點1,並終止於頂點1

6.從頂點4開始訪問,並終止於頂點4

從頂點1開始做深度搜尋:

初始狀態,從頂點1開始

依次訪問過頂點1,2,3後,終止於頂點3

從頂點3回溯到頂點2,繼續訪問頂點5,並且終止於頂點5

從頂點5回溯到頂點2,並且終止於頂點2

從頂點2回溯到頂點1,並終止於頂點1

從頂點4開始訪問,並終止於頂點4

上面的圖可以通過如下鄰接矩陣表示:

1

int maze[5][5] =,

3 ,

4 ,

5 ,

6

7 };

dfs核心**如下(遞迴實現):

1 #include 2

#define n 5

3using

namespace

std;

4int maze[n][n] =,

6 ,

7 ,

8 ,

9

10};

11int visited[n + 1] = ;

12void dfs(int

start)

1320 cout << start << "";

21}22int

main()

2330

return0;

31 }

非遞迴實現如下,借助乙個棧:

1 #include 2 #include 3

#define n 5

4using

namespace

std;

5int maze[n][n] =,

7 ,

8 ,

9 ,

10

11};

12int visited[n + 1] = ;

13void dfs(int

start)

1432}33

if (!is_push)

343839}

40}41int

main()

4249

return0;

50 }

dfs 深搜 模板

關於深度優先搜尋的效率問題,有多種解決方法。最具有通用性的是剪枝 prunning 也就是去除沒有用的搜尋分支。有可行性剪枝和最優性剪枝兩種。int mx 4 向上下左右四個方向移動 0,1 0,1 1,0 1,0 int my 4 bool check int x,int y 判斷是否滿足條件的子...

深搜DFS和廣搜BFS

一般來說,廣搜常用於找單一的最短路線,或者是規模小的路徑搜尋,它的特點是 搜到就是最優解 而深搜用於找多個解或者是 步數已知 好比3步就必需達到前提 的標題,它的空間效率高,然則找到的不必定是最優解,必需記實並完成全數搜尋,故一般情況下,深搜需要很是高效的剪枝 優化 像搜尋最短路徑這些的很顯著是用廣...

小貓爬山(DFS深搜)

翰翰和達達飼養了n只小貓,這天,小貓們要去爬山。經歷了千辛萬苦,小貓們終於爬上了山頂,但是疲倦的它們再也不想徒步走下山了 嗚咕 翰翰和達達只好花錢讓它們坐索道下山。索道上的纜車最大承重量為w,而n只小貓的重量分別是c1 c2 cn。當然,每輛纜車上的小貓的重量之和不能超過w。每租用一輛纜車,翰翰和達...