什麼是圖?
圖:表示多對多的關係。
包含:
-
一組頂點:通常用V(Vertex)表示的頂點集合
-
一組邊:通常E(Edge)表示邊的集合,也就是頂點對
- 無向邊:v — w 兩個頂點之間無論任何方向都可以連通 ,常用( v, w )表示
- 有向邊:v —> w 也就是隻允許從頂點A到頂點B,常用< v, w >表示
- 不考慮重邊和自迴路
圖的存儲結構
1、鄰接矩陣表示法
我表示看不懂
2、鄰接表表示法
圖的遍歷
1、深度優先搜索DFS (Depth First Search)
現在用點亮燈泡的方式模擬遍歷
步驟如下:
- 先點亮入口處A的燈,然後站在A處後發現有B和E兩處燈光未點亮
- 選擇點亮B,站在B處後發現C未點亮…
- 此處省略相同步驟,點亮D處的燈後發現面前有E、G、H三處未點亮
- 選擇點亮E,站在E處發現有A和F,A已經點亮了
- 選擇點亮F,然後發現到頭了,視野中所有的燈都亮着。此時不能直接結束點亮工作。
- 選擇原路返回,並檢查每個頂點是不是還有未點亮的燈,如果燈全部都亮了則繼續返回
- 退回到D後,發現還有G、H沒亮
- 選擇點亮G,然後到H
- 點亮到H之後發現視野中A、G、D的燈全部都亮着,於是繼續返回,並檢查
- 退回路徑G-D-C-B-A,流程結束
其實看到這整個流程,我腦子裏第一想法是這不是個堆棧嘛,點亮一個就入棧一個,然後視野中全部點亮了就出棧。
僞代碼實現,採用遞歸方式
2、廣度優先搜索(Breadth First Search)
廣度優先搜索使用了隊列,大概步驟分爲:
- 先把1壓入隊列,然後做出隊操作,1出隊
- 把1直接相關的頂點,234567做入隊操作
- 然後出隊操作,2出隊
- 把2相關的頂點8,9做入隊操作
- 然後出隊操作,3出隊
- 把3相關的頂點10做入隊操作
- 然後依次出隊把34567相關的頂點做入隊操作
- 然後出隊…
- 後面省略,大概就是這麼個過程直到隊列裏沒有元素爲止
僞代碼實現 :