《大話資料結構》之關鍵路徑演算法

2021-07-07 10:54:54 字數 1993 閱讀 6036

關鍵路徑演算法是在aoe網中找出完成所有活動耗時最長的路徑的方法。

程式中涉及的結構:

typedef char vertextype;

typedef int edgetype;

//鄰接節點結構

typedef struct edgenode

edgenode;

//頂點節點列表

typedef struct vertexnode

vertexnode,adjlist[maxvex];

//圖的總述結構

typedef struct

graphadjlist;

關鍵路徑的演算法是在aov網的拓補排序下完成的。

拓補排序基本思想就是:逐步找出aov網中入度為0的節點。輸出該節點後將與它相鄰的節點的入度減一,如果此時該節點入度為零就輸出。

輸出入度為0的節點過程中,可以借用棧等資料結構完成輸出。

ps:拓補序列不為1,同乙個網可以有多個不同的拓補序列。

拓補排序**如下:

int *etv,*ltv;

int *stack2;

int top2;

/*利用拓補排序判斷乙個網是否有環路

*/status topologicalsort(graphadjlist gl)

} top2 = 0;

ltv = (int *)malloc(gl->numvertexes * sizeof(int));

for(i=0;inumvertexes;i++)

stack2 = (int *)malloc(gl->numvertexes * sizeof(int));

while(0 != top)

/*計算事件發生最晚時間,即走最大路徑

*/if((ltv[gettop]+e->weight)>ltv[k])

}} if(count < gl->numvertexes)

else

}

以上程式同時記錄了乙個節點事件發生的最晚時間。

關鍵路徑**如下:

/*

求關鍵路徑

*/void criticalpath(graphadjlist gl)

/* 按拓補序列逆序計算事件的最早發生時間

*/ while(0 != top2)

}} /*

ete:活動的最早開工時間

lte:活動的最晚開工時間

etv:事件的最早發生時間

ltv:事件的最晚發生時間

*/ for(j=0;jnumvertexes;j++)}}}

ete:活動的最早開工時間

lte:活動的最晚開工時間

etv:事件的最早發生時間

ltv:事件的最晚發生時間

事件的最晚發生時間是從aoe網的起點開始,到達時間所需耗時(權重)最大的值。如下圖

事件的最早發生時間是和事件的最晚發生時間逆向計算的。事件的最晚發生時間,是從起點開始,往終點推算;事件的最早發生時間是從aoe網的終點開始,往起點逆向推算。

事件的最早發生時間=後繼事件的最晚發生時間-max(權重最大的邊),如下圖:

ps:對於aoe網的終點來說,事件的最早發生時間 = 事件的最晚發生時間

活動的最晚發生時間=活動的起點事件的最晚發生時間

活動的最早發生時間=活動的終點事件的最早發生時間 - 活動的耗時(邊的權重)

所謂的關鍵活動就是:活動的最早發生時間 = 活動的最晚發生時間。根本沒有選擇的餘地的。

理清了這四個時間,關鍵路徑演算法就沒什麼了。

大話資料結構 最短路徑演算法

迪傑斯特演算法的核心是首先正向把離起點最近的點乙個乙個找出來,然後從終點開始逆向計算最短路徑 利用圖資料結構實現dijkstra演算法的偽 如下 建立乙個陣列f記錄頂點是否已經計算離頂點最近的距離 建立乙個儲存路徑的陣列p 迴圈頂點個數的次數 將於k有連線的頂點w在距離d中的值更新,如果通過頂點k,...

大話資料結構之Prim演算法

構造最小生成樹可以有多種演算法。其中多數演算法利用了最小生成樹的下列一種簡稱為mst的性質 假設n v,是乙個連通網,u是頂點集v的乙個非空子集。若 u,v 是一條具有最小權值邊的邊,其中u屬於u,v屬於v u,則必存在一顆包含 u,v 的最小生成樹。prim演算法的定義 假設n p,e 是連通網,...

《大話資料結構》之Prim演算法

prim演算法作用是構造連通網的最小代價生成樹。演算法思想 以任意乙個點開始,找權值最小的一條邊,將此邊和兩個頂點加入最小生成樹集合,以最小生成樹的點集合中的每乙個點為起點,找尋終點不在集合中的權值最小的邊,並將結果加入集合,重複這個操作,直至所有的點都已經加入集合。圖的鄰接矩陣表示 typedef...