經典演算法之關鍵路徑

2021-08-21 14:05:42 字數 2041 閱讀 5510

設乙個工程有11項活動,9個事件,事件v1 ----- 表示整個工程開始,事件v9 ----- 表示整個工程結束。

每個事件的開始必須是它之前的活動已完成。例如:事件v2,v3,v4的開始必須是活動a1,a2,a3完成了。

這時我們會關注兩個問題:

(1)完成整個專案需要多少時間?

(2)哪些活動是影響工程進度的關鍵?

關鍵路徑:aoe-網中,從起點到終點最長的路徑的長度(長度指的是路徑上邊的權重和)

關鍵活動:關鍵路徑上的活動

aoe網:也叫邊表示活動的網。aoe網是乙個帶權的有向無環圖,其中頂點表示事件,弧表示活動,權表示活動持續的時間。

ve[j] :表示事件j 的最早發生時間

vi[j]: 表示事件j 的最遲發生時間

e[i]:表示活動ai的最早開始時間

l[i]:表示活動ai的最遲開始時間

以鄰接矩陣作為儲存結構

1、從原點v1出發,令ve[1] = 1,拓撲排序求各個頂點的ve[i]

2、從vn出發,令vl[n] = ve[n] ,逆拓撲排序求出各個頂點的vl[i]

3、根據各頂點的ve和vl值,計算每條弧的e[i] 和 l[i],找出e[i] = l[i] 的關鍵活動

簡單來說:

順拓撲排序取大值求出ve陣列,逆拓撲序列取小值求出vl陣列,最後找出ve[i] = vl[i] 的頂點,即關鍵路徑上的頂點,將這些頂點連線起來的路徑叫關鍵路徑。

}int a,b,values; //定義a,b,用來輸入,values儲存權值

int v,l; //頂點數和邊數

cout << "請輸入頂點數:";

cin >> v;

cout << "請輸入邊數:";

cin >> l;

cout << "請輸入邊:" << endl;

for(int i = 1; i <= l; i++)

int k; //用於計算度數

int id[n],od[n]; //儲存各頂點的入度和出度

int ve[n],vl[n]; //順拓撲序列取大,逆拓撲序列取小

memset(ve,0,sizeof(ve)); //初始化ve陣列全為0

for(int i = 1; i <= v; i++)

id[i] = k;

}for(int i = 1; i <= v; i++)}}

}for(int i = 1; i <= v; i++)

od[i] = k;

}k = v;

for(int i = 1; i <= v; i++) //將 vl 陣列全部初始化為ve最後一頂點的值

vl[i] = ve[k];

for(int i = k; i>=1; i--)}}

}cout << "****************************\n";

cout << "ve陣列:";

for(int i = 1; i <= k; i++)

cout << endl;

cout << "ve陣列:";

for(int i = 1; i <= k; i++)

cout << "\n****************************\n";

cout << "關鍵路徑:";

關鍵路徑演算法之php實現

拓撲排序主要是為解決乙個工程能否順序進行的問題,但有時我們還需要解決工程完成需要的最短時間問題。我們把路徑上各個活動所持續的時間之和稱為路徑長度,從源點到匯點具有最大長度的路徑叫關鍵路徑,在關鍵 路徑上的活動叫關鍵活動。關鍵路徑演算法基於拓撲排序演算法,這裡直接上 以後有機會再詳解。class ed...

關鍵路徑 CriticalPath演算法

關鍵路徑 即決定一項工程的完成時間的路徑。如下圖所示,是一輛汽車的生產流程,其中外殼 發動機 輪子等的生產過程都是可以並行進行的,但是傳送機生產需要的時間最長,而只有所有零部件生產完成才才能進行下一步,因此圖中用紅色加粗的那一條路徑即為該工程的關鍵路徑 即決定工程的實際完成時間的路徑 critica...

關鍵路徑 CriticalPath演算法

關鍵路徑 即決定一項工程的完成時間的路徑。如下圖所示,是一輛汽車的生產流程,其中外殼 發動機 輪子等的生產過程都是可以並行進行的,但是傳送機生產需要的時間最長,而只有所有零部件生產完成才才能進行下一步,因此圖中用紅色加粗的那一條路徑即為該工程的關鍵路徑 即決定工程的實際完成時間的路徑 critica...