1. 程式人生 > >資料結構(C#版本)_圖

資料結構(C#版本)_圖

推薦閱讀:

頂點的度=頂點的入度+頂點的出度。

頂點 v 的入度是指以該頂點 v 為弧頭的弧的數目;頂點 v 的出度是指以該頂點 v 為弧尾的弧的數目。

簡單路徑:一條路徑上頂點不重複出現。

迴路:第一個頂點和最後一個頂點相同的路徑。

簡單迴路:除第一個頂點和最後一個頂點相同其餘頂點都不重複的迴路。

連通:在無向圖中,若兩個頂點之間有路徑。

連通圖:無向圖 G 中任意兩個頂點之間都是連通的。

強連通圖:在有向圖中,若圖中任意兩個頂點之間都存在從一 個頂點到另一個頂點的路徑。

最小生成樹:邊的權值總和最小的生成樹。

構造有 n 個頂點的無向連通網的最小生成樹必須 滿足以下三個條件:

(1)構造的最小生成樹必須包括 n 個頂點;

(2)構造的最小生成樹有且僅有 n-1 條邊;

(3)構造的最小生成樹中不存在迴路。

構造最小生成樹的方法:普里姆(Prim);克魯斯卡爾(Kruskal)演算法。

普里姆(Prim):

假設 G=(V,E)為一無向連通網,其中,V 為網中頂點的集合,E 為網中 邊的集合。設定兩個新的集合 U 和 T,其中,U 為 G 的最小生成樹的頂點的集 合,T 為 G 的最小生成樹的邊的集合。普里姆演算法的思想是:令集合 U 的初值 為 U={u1}(假設構造最小生成樹時從頂點 u1 開始),集合 T 的初值為 T={}。從 所有的頂點 u∈U 和頂點 v∈V-U 的帶權邊中選出具有最小權值的邊(u,v),將頂 點 v 加入集合 U 中,將邊(u,v)加入集合 T 中。如此不斷地重複直到 U=V 時, 最小生成樹構造完畢。此時,集合 U 中存放著最小生成樹的所有頂點,集合 T中存放著最小生成樹的所有邊。
在這裡插入圖片描述


克魯斯卡爾(Kruskal)演算法:對一個有 n 個頂點的無向連通網,將圖中的 邊按權值大小依次選取,若選取的邊使生成樹不形成迴路,則把它加入到樹中; 若形成迴路,則將它捨棄。如此進行下去,直到樹中包含有 n-1 條邊為止。
在這裡插入圖片描述
最短路徑:狄克斯特拉(Dikastra)演算法:設定 兩個頂點的集合 S 和 T,集合 S 中存放已找到最短路徑的頂點,集合 T 中存放當 前還未找到最短路徑的頂點。初始狀態時,集合 S 中只包含源點,設為 v0,然 後從集合 T 中選擇到源點 v0 路徑長度最短的頂點 u 加入到集合 S 中,集合 S 中 每加入一個新的頂點 u 都要修改源點 v0 到集合 T 中剩餘頂點的當前最短路徑長 度值,集合 T 中各頂點的新的最短路徑長度值為原來的當前最短路徑長度值與 從源點過頂點 u 到達該頂點的新的最短路徑長度中的較小者。此過程不斷重複, 直到集合 T 中的頂點全部加到集合 S 中為止。