1. 程式人生 > >圖(Graph)——最小生成樹、最短路徑、Kruskal、Dijkstra、Floyd

圖(Graph)——最小生成樹、最短路徑、Kruskal、Dijkstra、Floyd

4. 最小生成樹

4.1 生成樹

(1)定義:所有頂點均由邊連線在一起,但不存在迴路的圖叫該圖的生成樹
(2)深度優先生成樹與廣度優先生成樹

(3)

    一個圖可以有許多棵不同的生成樹
    所有生成樹具有以下共同特點:
           生成樹的頂點個數與圖的頂點個數相同
           生成樹是圖的極小連通子圖

4.2 最小生成樹

生成樹的每條邊上的權值之和最小。

例項:在N個城市之間修路,總路線的總和最小問題。

4.2.1 Prim方法

設N=(V,{E})是連通網,TE是N上最小生成樹中邊的集合:
(1)初始令U={u0},(u0屬於V), TE=NULL
(2)在所有u屬於U,v屬於V-U的邊(u,v)屬於E中,找一條代價最小的邊(u0,v0)
(3)將(u0,v0)併入集合TE,同時v0併入U
(4)重複上述操作直至U=V為止,則T=(V,{TE})為N的最小生成樹

4.2.2 Kruskal演算法

設連通網N=(V,{E}),令最小生成樹
(1)初始狀態為只有n個頂點而無邊的非連通圖T=(V,{NULL}),每個頂點自成一個連通分量
(2)在E中選取代價最小的邊,若該邊依附的頂點落在T中不同的連通分量上,則將此邊加入到T中;否則,捨去此邊,選取下一條代價最小的邊
(3)依此類推,直至T中所有頂點都在同一連通分量上為止


5.拓撲排序和 關鍵路徑

5.1 拓撲排序

拓撲排序的基礎:有向無環圖,它是描述一項工程進度的有效工具。

5.1.1 AOV網

用頂點表示活動,用弧表示活動間優先關係的有向圖稱為頂點表示活動的網(Activity On Vertex network),簡稱AOV網

5.1.2 拓撲排序演算法

(1)在有向圖中選一個沒有前驅的頂點且輸出之
(2)從圖中刪除該頂點和所有以它為尾的弧
(3)重複上述兩步,直至全部頂點均已輸出;或者當圖中不存在無前驅的頂點為止

5.2 關鍵路徑

在AOV網中,完成工程的最短時間:從開始點到完成點的最長路徑長度——關鍵路徑。

Ve(j)——表示事件Vj的最早發生時間
Vl(j)——表示事件Vj的最遲發生時間
e(i)——表示活動ai的最早開始時間
l(i)——表示活動ai的最遲開始時間
l(i)-e(i)——表示完成活動ai的時間餘量


6. 最短路徑

最短路徑:路徑上所有邊的權值之和最小。

6.1 某頂點到其它個點的最短路徑

Dijkstra演算法:

(1)初使時令 S={V0},T={其餘頂點},T中頂點對應的距離值
(2)若存在<V0,Vi>,為<V0,Vi>弧上的權值
(3)若不存在<V0,Vi>,為無窮
(4)從T中選取一個其距離值為最小的頂點W,加入S
(5)對T中頂點的距離值進行修改:若加進W作中間頂點,從V0到Vi的距離值比不加W的路徑要短,則修改此距離值
(6)重複上述步驟,直到S中包含所有頂點,即S=V為止

6.2 每對頂點之間的最短路徑

Floyd演算法:

(1)初始時設定一個n階方陣,令其對角線元素為0,若存在弧<Vi,Vj>,則對應元素為權值;否則為無窮
(2)逐步試著在原直接路徑中增加中間頂點,若加入中間點後路徑變短,則修改之;否則,維持原值
(3)所有頂點試探完畢,演算法結束