aoe網求關鍵路徑(關鍵活動):
aoe網求解關鍵路徑,所需的是有向無環圖(利用拓撲排序,如果序列長度為頂點數,則是無環,小於頂點數則是有環圖,有環圖是不滿足求aoe網的),注意的是,只有乙個源點,有乙個匯頂點,然後關鍵路徑不一定只有一條。注意,這裡要理解:
頂點:事件
邊:活動
還有四個陣列下面有介紹:
這裡我們用到的圖:
關鍵活動已經用紅色標記出來
**如下:
#
include
#include
#define
inf330
#define
max50
typedef
struct
node
arcnode;
//定義結點的結構體型別
typedef
struct
vnnode;
//定義頭結點的結構體
typedef
struct
adjgraph;
//定義圖表的結構體型別
typedef
struct
keynode;
//關鍵活動
//建立鄰接圖
void
createadj
(adjgraph *
&g,int a[max]
[max]
,int n,
int e)
//迴圈找結點
for(
int i =
0; i
)for
(int j = n-
1; j>=
0; j--)if
(a[i]
[j]!=
0&& a[i]
[j]!=inf)
//如果有邊
}//輸入圖的鄰接表
void
showadj
(adjgraph *g)
printf
("/\\");
printf
("\n");
}}//拓撲排序輸出
/*演算法的主要思想,乙個是找入度為0的頂點進棧,二個每次出棧乙個頂點,
*/int
tp(adjgraph *g,
int toplist)
//引數陣列toplist是用來儲存拓撲序列的,用來判斷是否成環
//在棧不空的情況下,出棧乙個頂點,然後將這個頂點的所有有邊的另外一端的頂點迴圈判斷,如果入度為0,則進棧。遍歷完之後接著出棧乙個頂點,在遍歷....迴圈同樣的操作
while
(top>-1
)//遍歷下乙個頂點。
p =p ->nextarc;}}
return d;
//返回拓撲陣列的長度 ,注意下標
}//aoe求關鍵活動
/*演算法的主要思想是求出事件的最早開始時間,(ve[max])
事件的最遲開始時間,(vl[max])
活動的最早開始時間,(ea[max])
活動的最遲開始時間。(el(max))
然後用乙個結構體陣列儲存關鍵活動以及兩端的頂點。
*/ bool aoesearch
(adjgraph *g, keynode ky[max]
,int
&d)///結構體陣列,以及下標d
//找每個事件的最早開始事件。(找最大)
for(
int i =
0; in; i++)}
//初始化,每個事件的最晚開始事件為匯點的最早開始時間
for(
int i =
0; in; i++
) vl[i]
= ve[lnode]
;//逆序找每個事件的最晚開始事件(找最小)
for(
int i= g->n-
2; i>=
0; i--)//
}//找關鍵活動((儲存到結構體陣列中)
for(
int i =
0; in; i++
) p = p->nextarc;}}
return true;
}void
showpath
(adjgraph *g, keynode ky,
int d)
p = p->nextarc;}}
}int
main()
,,,,
,,,,
};int n=9;
int e=11;
createadj
(b,a,n,e)
;showadj
(b);
printf
("\n拓撲排序輸出序列為: ");
aoesearch
(b,ky,d)
;printf
("\n ");
printf
("\n關鍵活動如下:\n");
showpath
(b,ky,d)
;return0;
}
程式執行如下::
求關鍵路徑 邊活動網(AOE)
題目大意 前提 有向無環圖 dag 才有解。aoe網 邊活動網 點為事件,帶權的邊集為活動,權為完成活動所需要的時間。求計算完成總事件的最短時間。即求最長路徑 此處最長即完成所有關鍵活動,即滿足了實現總事件的最短時間問題。思路 先求點,再求邊。求最長路徑 求所有關鍵活動 判斷是否為關鍵活動 最遲開始...
AOE網 關鍵路徑和關鍵活動
全域性棧 seqstacksq2 typedef struct edgenode edgenode typedef struct vertexnode vertexnode,adjlist maxvex typedef struct graphadjlist,graphadjlist 構建節點 ed...
AOE網的關鍵路徑
事件的最早發生時間和最晚發生時間 活動的最早開始時間和最晚開始時間 生活中往往有著這樣的場景,我們想做一件事情,但是需要做其他的事情來達到這件事情,例如,學資料結構之前,首先需要學一門程式語言,還要學習離散數學,如果學語言需要耗費半年時間,學離散數學需要一年事件,那麼我們能學資料結構需要的最短時間是...