求乙個乙個流圖的所有節點的支配節點的演算法
輸入:乙個流圖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 ...