簡單圖(****** graph):無環並且無平行邊的圖.
路(path):內部點互不相同的鏈。
如果無向圖g中每一對不同的頂點x和y都有一條路,(即w(g)=1,連通分支數)則稱g是連通圖,反之稱為非連通圖。
兩端點相同的路(即閉路)稱為圈(cycle)。
樹(tree)是無圈連通無向圖。樹中度數為1的結點稱為樹的葉結點。樹中度數大於1的結點稱為樹的分支節點或內部結點。
不相交的若干樹稱為森林(forest),即森林的每個連通分支是樹。
定理1:t是樹<=>t中無環,且任何不同兩頂點間有且僅有一條路。
定理2:t是樹<=>t連通且|e|=n-1,|e|為t的邊數,n為t的頂點數。
由根到某一頂點v的有向路的長度,稱為頂點v的層數(level)。根樹的高度就是頂點層數的最大值。
生成子圖:若g1包含於g,且v1=v,則稱g1是g的生成子圖或支撐子圖。
如果t是g的乙個生成子圖而且又是一棵樹,則稱t是圖g的一棵生成樹(spanning tree)或支撐樹。
生成樹t中的邊稱為樹t的樹枝(branch),不在生成樹t中的g的邊,稱為樹t的弦(chord)
定理1:圖g有生成樹<=>g為連通圖。
深度優先搜尋:
求連通簡單圖g的一棵生成樹的許多方法中,深度優先搜尋(depth first search)是乙個十分重要的演算法。
基本思想:
任意選擇圖g的乙個頂點v0作為根,通過相繼地新增邊來形成在頂點v0開始的路,其中每條新邊都與路上的最後乙個頂點以及不在路上的乙個頂點相關聯。繼續盡可能多地新增邊到這條路。若這條路經過圖g的所有頂點,則這條路即為g的一棵生成樹;若這條路沒有經過g的所有頂點,不妨設形成這條路的頂點順序v0,v1,......,vn。則返回到路裡的次最後頂點v(n-1).若有可能,則形成在頂點v(n-1)開始的經過的還沒有放過的頂點的路;否則,返回到路裡的頂點v(n-2)。然後再試。重複這個過程,在所訪問過的最後乙個頂點開始,在路上次返回的頂點,只要有可能就形成新的路,知道不能新增更多的邊為止。
深度優先搜尋也稱為回溯(back tracking)
用深度優先搜哦所來找出圖3-9所示圖g的生成樹,任意地從頂點d開始,生成步驟顯示在圖3-10。
廣度優先搜尋:
可用廣度優先搜尋(breadth first search)來產生連通簡單圖的生成樹。
基本思想:
從圖的頂點中任意第選擇乙個根,然後新增與這個頂點相關聯的所有邊,在這個階段新增的新頂點成為生成樹里1層上的頂點,任意地排序它們。下一步,按照順序訪問1層上的每乙個頂點,只要不產生迴路,就新增與這個頂點相關聯的每個邊。這樣就產生了樹里2的上的頂點。遵循同樣的原則繼續下去,經有限步驟就產生了生成樹。
用廣度優先搜尋找出圖3-9所示圖g的生成樹,選擇頂點f作為根。
深度優先遍歷 遞迴 深度優先搜尋和廣度優先搜尋
對於搜尋來說,我們絕大多數情況下處理的都是叫 所謂的暴力搜尋 或者是說比較簡單樸素的搜尋,也就是說你在搜尋的時候沒有任何所謂的智慧型的情況在裡面考慮,很多情況下它做的一件事情就是把所有的結點全部遍歷一次,然後找到你要的結果。基於這樣的乙個資料結構,如果這個資料結構本身是沒有任何特點的,也就是說是乙個...
什麼是深度優先和廣度優先
1.深度優先 2.廣度優先 對於演算法來說 無非就是時間換空間 空間換時間 深度優先不需要記住所有的節點,所以占用空間小,而廣度優先需要先記錄所有的節點占用空間大 深度優先有回溯的操作 沒有路走了需要回頭 所以相對而言時間會長一點 深度優先採用的是堆疊的形式,即先進後出 廣度優先則採用的是佇列的形式...
深度優先搜尋和廣度優先搜尋
深度優先的思想是先記住當前的起點,然後選定乙個方向一條道走到黑,若失敗則回到起點再選定另外乙個方向走到黑。廣度優先的思想是記住當前的起點,然後選定各個方向的相鄰點作為新的起點,再繼續。可以看出,深度優先和廣度優先都需要記住當前的起點,不同的是深度優先每次只需要記住乙個方向的相鄰點,廣度優先則要記住所...