圖(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)所有頂點試探完畢,演算法結束