樹邊,前向邊,後向邊,橫叉邊,應該說,不是乙個圖本身有的概念,應該是圖進行dfs時才有的概念。圖進行dfs會得到一棵dfs樹(森林),在這個樹上才有了這些概念。對圖進行dfs,可以從任意的頂點開始,遍歷的方式也是多樣的,所以不同的遍歷會得到不同的dfs樹,進而產生不同的樹邊,前向邊,後向邊,橫叉邊。所以這4種邊,是乙個相對的概念。
在圖的遍歷中,往往設定了乙個標記陣列vis的bool值來記錄頂點是否被訪問過。但有些時候需要改變vis值的意義。令vis具有3種值並表示3種不同含義
vis = 0,表示該頂點沒沒有被訪問
vis = 1,表示該頂點已經被訪問,但其子孫後代還沒被訪問完,也就沒從該點返回
vis = 2,,表示該頂點已經被訪問,其子孫後代也已經訪問完,也已經從該頂點返回
可以vis的3種值表示的是一種順序關係和時間關係
《演算法導論》334頁有這4種邊的準確定義,在此不累述
dfs過程中,對於一條邊u->v
vis[v] = 0,說明v還沒被訪問,v是首次被發現,u->v是一條樹邊
vis[v] = 1,說明v已經被訪問,但其子孫後代還沒有被訪問完(正在訪問中),而u又指向v?說明u就是v的子孫後代,u->v是一條後向邊,因此後向邊又稱返祖邊
vis[v] = 3,z說明v已經被訪問,其子孫後代也已經全部訪問完,u->v這條邊可能是一條橫叉邊,或者前向邊
注意:樹邊,後向邊,前向邊,都有祖先,後裔的關係,但橫叉邊沒有,u->v為橫叉邊,說明在這棵dfs樹中,它們不是祖先後裔的關係它們可能是兄弟關係,堂兄弟關係,甚至更遠的關係,如果是dfs森林的話,u和v甚至可以在不同的樹上
在很多演算法中,後向邊都是有作用的,但是前向邊和橫叉邊的作用往往被淡化,其實它們沒有太大作用。
深度優先遍歷之樹邊,前向邊,回邊,橫跨邊
無意翻到一篇大佬的部落格,感覺寫得很好,給了我很大的幫助,特此 根據在有向圖g上進行深度優先遍歷所產生的深度優先森林,可以把圖中的邊分為四類 1 樹邊 是dfs森林的實際組成部分。如果頂點v是在探測邊 u,v 時首次被發現的,那麼 u,v 就是一條樹邊。2 前向邊 是dfs樹中從乙個頂點指向該頂點的...
字典樹(邊改邊抄)
它有3個基本性質 根節點不包含字元,除根節點外每乙個節點都只包含乙個字元。從根節點到某一節點,路徑上經過的字元連線起來,為該節點對應的字串。每個節點的所有子節點包含的字元都不相同。其基本操作有 查詢 插入和刪除,當然刪除操作比較少見。我在這裡只是實現了對整個樹的刪除操作,至於單個word的刪除操作也...
鏈式前向星存邊
這邊文章是基於網上流傳最廣的改編,改了點內容方便更好的理解。我們輸入邊的順序為 1 2,2 3,3 4,1 3,4 1,1 5,4 5 void add int u,int v,int w 按上圖模擬一下 add 1,2,w1 edge 0 to 2 edge 0 next head 1 1 hea...