一、AOV網絡與拓撲排序
AOV網(Activity On Vertex NetWork)用頂點表示活動,邊表示活動(頂點)發生的先后關系。
若網中所有活動均可以排出先后順序(任兩個活動之間均確定先后順序),則稱網是拓撲有序的。
1、算法步驟
- 在網絡中選擇一個入度為0的頂點輸出;
- 在圖中刪除該頂點及所有以該頂點為起點的邊;
- 重復上述過程,直至所有邊均被輸出。
2、算法圖解
3、算法demo:
#include <bits/stdc++.h>
using namespace std;
const int M = 10001;
int matrix[M][M];
int indegree[M]; //book已排序的頂點個數
int main(int argc, char const *argv[])
{
int i, j, a, b, k, book = 0, n, m;
cin >> n >> m;
for (i = 1; i <= m; ++i)
{
cin >> a >> b;
matrix[a][b]=1;
indegree[b]++;
}
for (i = 1; i <= n; ++i)
{
for (j = 1; j <= n; ++j)
{
if (indegree[j] == 0)
{
cout << j << " ";
//遍歷所有入度為0的頂點
indegree[j] = -1;
book++;
for (k=1; k <= n; k++)
{
if (matrix[j][k] == 1)
{
//遍歷所有入度為1的頂點
matrix[j][k] = 0;
indegree[k]--;
}
}
break;
}
}
}
system("pause");
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
二、AOE網絡
AOE網的定義:在帶權有向圖中若以頂點表示事件,有向邊表示活動,邊上的權值表示該活動持續的時間,這樣的圖簡稱為AOE網。
如上所示,共有11項活動(11條邊),9個事件(9個頂點)。整個工程只有一個開始點和一個完成點。即只有一個入度為零的點(源點)和只有一個出度為零的點(匯點)。
關鍵路徑:是從開始點到完成點的最長路徑的長度。路徑的長度是邊上活動耗費的時間。如上圖所示,1 到2 到 5到7到9是關鍵路徑(關鍵路徑不止一條,請輸出字典序最小的),權值的和為18。
三、AOV網絡與AOE網絡的關系
從定義上來看,很容易看出兩種網的不同,AOV網的活動以頂點表示,而AOE網的活動以有向邊來表示,AOV網的有向邊僅僅表示活動的先后次序。縱觀這兩種網圖,其實它們總體網絡結構是一樣的,僅僅是活動所表示的方式不同,因此可以猜想從AOV網轉換成AOE網應該是可行的。
通常AOE網都是和關鍵路徑聯系在一起的,在AOE網中我們可以通過關鍵路徑法來計算影響整個工期的關鍵路徑,達到縮短工期的目的。在傳統的AOV網中是沒有表示活動時間的權值的,因此傳統的AOV網無法估算工期,但是如果我們在AOV網中的活動結點上都標上時間屬性,那么AOV網就可以完全轉換為AOE網。