【数据结构-图】4.拓扑排序和关键路径(注解+原理)
一、拓撲排序
1.1 基本知識
有向無環(huán)圖:一個有向圖中不存在環(huán),簡稱DAG圖
AOV網(wǎng):用DAG圖表示一個工程,其頂點表示活動,用有向邊 <Vi,Vj><V_i, V_j><Vi?,Vj?> 表示活動 ViV_iVi? 必須先于活動 VjV_jVj? 進行的這樣一種關(guān)系。
在AOV網(wǎng)中,活動 ViV_iVi? 是活動 VjV_jVj? 的先行活動,活動 VkV_kVk? 是活動 ViV_iVi? 的先行活動,則活動 VkV_kVk? 必是活動 VjV_jVj? 的先行活動,這種先行關(guān)系具有傳遞性
AOV網(wǎng)不具有唯一性
1.2 求拓撲排序的基本思想
1.3 圖示過程
如圖a,V1的入度為0,V2的入度為1,V3的入度為2,V4的入度為2,V5的入度為2,所以將V1取出,如圖b
如圖b,V2的入度為0,V3的入度為2,V4的入度為1,V5的入度為2,所以將V2取出,如圖c
如圖c,V3的入度為1,V4的入度為0,V5的入度為2,所以將V4取出,如圖d
如圖d,V3的入度為0,V5的入度為1,所以將V3取出,如圖e
如圖e,V5的入度為0,所以將V5取出,如圖f
此時沒有其他頂點了,整個拓撲排序為:{V1,V2,V4,V3,V5}
1.4 算法思想
求所有頂點的入度,可以附設(shè)一個存放各頂點入度的數(shù)組indegree[]
把所有入度為0的頂點入隊列或棧
當(dāng)棧或隊列不空時
若此時輸出的頂點數(shù)小于有向圖中的頂點數(shù),則說明有向圖中存在回路,否則輸出的頂點的順序即為一個拓撲序列。
二、關(guān)鍵路徑
2.1 基本知識
AOE網(wǎng):在帶權(quán)有向圖圖中,以頂點表示事件,以有向邊表示活動,以邊上的權(quán)值表示完成該活動的開銷(比如完成活動的時間)
AOE網(wǎng)的性質(zhì):
2.2 求關(guān)鍵路徑的基本思想
ve(Vi)ve(V_i)ve(Vi?):表示事件 ViV_iVi? 的最早發(fā)生時間
該時間是指從開始頂點 VVV 到頂點 ViV_iVi? 的最長路徑,事件的最早發(fā)生時間決定了所有從 ViV_iVi? 開始的活動能夠開工的最早時間。可用下面的遞推公式來計算∶
ve(Vi)=max?i{ve(Vi)+wi,j}(wi,j表示<Vi,Vj>上的權(quán)值)ve(V_i)=\max\limits_{i} \bigg\{ve(V_i)+w_{i,j}\bigg\}(w_{i,j}表示<V_i,V_j>上的權(quán)值) ve(Vi?)=imax?{ve(Vi?)+wi,j?}(wi,j?表示<Vi?,Vj?>上的權(quán)值)
vl(Vi)vl(V_i)vl(Vi?):表示事件 ViV_iVi? 的最晚發(fā)生時間
該時間是指在不推遲整個工程完成的前提下,即保證它所指向的事件 ViV_iVi? ,即保證它所指向的事件 ViV_iVi? 在 ve(Vi)ve(V_i)ve(Vi?) 時刻能夠發(fā)生時,該事件最遲必須發(fā)生的時間。可用下面的遞推公式來計算∶
ve(Vi)=min?j{vl(Vj)?wi,j}ve(V_i)=\min\limits_{j} \bigg\{vl(V_j)-w_{i,j}\bigg\} ve(Vi?)=jmin?{vl(Vj?)?wi,j?}
e(Vi)e(V_i)e(Vi?):表示事件 ViV_iVi? 的最早開始時間
該時間是指該活動的起點所表示的事件最早發(fā)生的時間。若邊 <Vi,Vk><V_i, V_k><Vi?,Vk?> 表示活動 aia_iai?,則有如下公式
e(Vi)=ve(Vj)e(V_i)=ve(V_j) e(Vi?)=ve(Vj?)
l(Vi)l(V_i)l(Vi?):表示事件 ViV_iVi? 的最晚開始時間
該時間是指該活動的終點所表示事件的最遲發(fā)生時間與該活動所需時間之差。若邊 <Vi,Vj><V_i,V_j><Vi?,Vj?> 表示活動 aia_iai?,則有如下公式
l(Vi)=vl(Vk)?wj,kl(V_i)=vl(V_k)-w_{j,k} l(Vi?)=vl(Vk?)?wj,k?
一個活動 aia_iai? 的最遲開始時間 l(Vi)l(V_i)l(Vi?) 和其最早開始時間 e(Vi)e(V_i)e(Vi?) 的差額 d(i)=l(Vi)?e(Vi)d(i)=l(V_i) - e(V_i)d(i)=l(Vi?)?e(Vi?)
它是指該活動完成的時間余量,即在不增加完成整個工程所需總時間的情況下,活動 aia_iai? 可以拖延的時間。若一個活動的時間余量為零,則說明該活動必須要如期完成,否則就會拖延完成整個工程的進度,所以稱 l(Vi)?e(Vi)=0l(V_i) - e(V_i)=0l(Vi?)?e(Vi?)=0 即 l(Vi)=e(Vi)l(V_i)=e(V_i)l(Vi?)=e(Vi?) 的活動 aia_iai? 是關(guān)鍵活動。
2.3 求關(guān)鍵路徑的算法步驟
總結(jié)
以上是生活随笔為你收集整理的【数据结构-图】4.拓扑排序和关键路径(注解+原理)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【数据结构-图】3.图的最短路径的几种算
- 下一篇: 【程序人生】不想一辈子做底层码农?快来看