設乙個工程有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...