演算法構造domaintree

2022-10-09 21:12:22 字數 1230 閱讀 7609

求乙個乙個流圖的所有節點的支配節點的演算法

輸入:乙個流圖g,g的節點集合是,邊的集合是

輸出:對於n中的每個節點n,給出d,即所有支配節點n的節點集合d

方法:對於n中所有節點 d = out[n]

圖1演算法執行過程

d =

d = u d =

d = u ∩ d ∩d ∩d } = u ∩ ∩ ∩d =

d =

d =

d =

d =

d =

d =

d =

對乙個流圖g的深度優先遍歷。

從入口節點開始,並首先訪問離入口節點最遠的節點,乙個深度優先過程過程中的搜尋路徑形成乙個深度優先樹

如圖1右側,實線邊構成了乙個深度優先生成樹。虛線邊是流圖中的其他邊。

這個樹的深度優先遍歷是1-3-4-6-7-8-10,回退到8,在訪問9,回到8,回到7-6-4,前進到5,從5回到4,回到3-1,最後從1前進到2

深度優先排序:

對乙個流圖g,他的生成樹是t,那麼對t的後序遍歷的反序列就是乙個流圖g的乙個深度優先排序。

對於圖1的深度生成樹

前序遍歷

1 3 4 6 7 8 10 9 5 2

後續遍歷

10 9 8 7 6 5 4 3 2 1

深度優先排序

1 2 3 4 5 6 7 8 9 10

深度優先生成樹和深度優先排序

輸入:乙個流圖g

輸出:g的乙個深度優先樹t和乙個深度優先排序

方法:我們用遞迴過程search(n),該演算法先將g中所有節點初始化為unvisited,然後呼叫search(n0),其中n0是入口節點,當它呼叫search(n),首先將n設定為visited,未免將n再次加入樹中,使用乙個c作為計數器,g的節點總數,乙個倒計數到1,在演算法執行的時候,把c的值賦給節點n的深度優先編號dfn[n],邊的集合t形成了g的深度優先生成樹。

search (n)

dfn[n] = c;

c = c - 1;

}main()//空集

for(g的所有節點n)

把n標記為unvisted

c = g 的節點個數

search()

}深度生成樹中的邊

1,前進邊 從生成樹節點到達後代節點的邊 。

2,後退邊 從生成樹到達其祖先的邊。

3,交叉邊,兩個節點不存在父子關係。不互為祖先。

演算法雜談 構造數獨

數獨描述 在9 9的格仔內,填入1 9,要求每一行每一列不能有重複數,並且,每個格仔所處的3 3格仔內不得有重複數。分析 這是乙個典型的遞迴回溯演算法,本例中用乙個except 9 9 9 的陣列來構造每個格仔的禁忌表 就是該格仔中不能填入的數 用變數hs來表示此次填數是向前遞迴運算還是回溯運算。如...

Java 樹的構造演算法

class uf 將所有連通觸點指向最後的觸點 int find int p void union int p,int q for int i 0 i id.length i boolean connection int p,int q int count class uf1 查詢觸點的根觸點,類似...

Andrew 演算法(構造凸包)

這是乙個基 graham 思想的又乙個演算法,我個人認為其中複雜度的改進應該是在 sort 的 cmp 部分吧,graham 的 cmp 部分需要對兩個點算出叉乘,甚至在某些情況還要算出兩個點的距離,這一步驟應該相對而言複雜度是較高的。而 andrew 很好的避免了這一步驟,直接通過對點的 x,y ...