日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【数据结构-图】4.拓扑排序和关键路径(注解+原理)

發(fā)布時間:2025/3/20 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【数据结构-图】4.拓扑排序和关键路径(注解+原理) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、拓撲排序

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 求拓撲排序的基本思想
  • 從有向圖中選一個無前驅(qū)(入度為0)的頂點輸出
  • 將此頂點和以它為起點的弧刪除
  • 重復(fù)步驟1和步驟2,直到不存在無前驅(qū)的頂點
  • 若此時輸出的頂點數(shù)小于有向圖中的頂點數(shù),則說明有向圖中存在回路,否則輸出的頂點的順序即為一個拓撲序列。
  • 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)棧或隊列不空時

  • 出棧或出隊列頂點為u,輸出頂點u
  • 頂點u的所有鄰接點入度減一,如果有入度為O的頂點,則入棧或入隊
  • 若此時輸出的頂點數(shù)小于有向圖中的頂點數(shù),則說明有向圖中存在回路,否則輸出的頂點的順序即為一個拓撲序列。

  • 二、關(guān)鍵路徑

    2.1 基本知識

    AOE網(wǎng):在帶權(quán)有向圖圖中,以頂點表示事件,以有向邊表示活動,以邊上的權(quán)值表示完成該活動的開銷(比如完成活動的時間)

    AOE網(wǎng)的性質(zhì):

  • 只有在某頂點所代表的事件發(fā)生后,從該頂點出發(fā)的各有向邊所代表的活動才能開始
  • 只有在進入某一頂點的各有向邊所代表的活動都已結(jié)束時,該頂點所代表的事件才能發(fā)生
  • 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?)=0l(Vi)=e(Vi)l(V_i)=e(V_i)l(Vi?)=e(Vi?) 的活動 aia_iai? 是關(guān)鍵活動。

    2.3 求關(guān)鍵路徑的算法步驟
  • 求 AOE 網(wǎng)中所有事件的最早發(fā)生時間 ve(Vi)ve(V_i)ve(Vi?)
  • 求 AOE 網(wǎng)中所有事件的最遲發(fā)生時間 vl(Vi)vl(V_i)vl(Vi?)
  • 求 AOE 網(wǎng)中所有活動的最早開始時間 e(Vi)e(V_i)e(Vi?)
  • 求 AOE 網(wǎng)中所有活動的最遲開始時間l(Vi)l(V_i)l(Vi?)
  • 求 AOE 網(wǎng)中所有活動的差額 d()d()d() ,找出所有 d()=0d()=0d()=0 的活動構(gòu)成關(guān)鍵路徑。
  • 總結(jié)

    以上是生活随笔為你收集整理的【数据结构-图】4.拓扑排序和关键路径(注解+原理)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。