摘要:本文簡要介紹了拓撲排序算法的原理,並給出了基於鄰接矩陣實現的拓撲排序c++源碼
關鍵字:拓撲排序,topological sort,AOV網絡
最近在論壇上看到一個百度的筆試題,大概意思是給定N個有依賴關係但是沒有循環依賴的源碼文
件,要求給這些源文件確定一個合適的編譯順序。這個跟選修課程的先後順序一樣,是個典型的拓撲排序
問題。拓撲排序針對的是AOV網絡,即Activity on Vertex Network,這種模型在有向圖中若以頂點表示活
動,有向邊表示活動之間的先後關係。下麵給出這類問題的一種基於鄰接矩陣
的通用算法:
1)用一個矩陣Matrix[N][N]保存結點的前驅關係,即如果i是j的前驅結點,則Matrix[i][j]=1,
否則,Matrix[i][j]=0;(其中i表示行,j表示列)
2) 用一個以為數組into[N]保存每個節點的入度;
3) for i = 1 to N //循環N次
j = 0;
while(j < N && into[j] != 0) j++;//尋找入度為0的結點j
輸出節點j
將into[j]設為N以免再次輸出;
for k = 1 to N //遍曆矩陣的第j行
if (Matrix[j][k] == 1) into[k]–;
該算法的時間複雜度是O(N^2)。
算法的c++實例源碼如下:(VC++6.0編譯測試通過)
/*
* 拓撲排序
* 使用鄰接矩陣表示圖
*/
#include
using namespace std;
#define N 9
/* global data */
//如果i是j的直接前驅,matrix[i][j] = true, 否則martix[i][j] = false;
//其中i表示行,j表示列
int matrix[N][N]=
{
0,0,1,0,0,0,0,1,0,
0,0,1,1,1,0,0,0,0,
0,0,0,1,0,0,0,0,0,
0,0,0,0,0,1,1,0,0,
0,0,0,0,0,1,0,0,0,
0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,1,
0,0,0,0,0,0,1,0,0
};
int into[N];
/* functions declaration */
void get_into_degree(int n);
void toposort(int n);
int main(int argc, char* *argv)
{
get_into_degree(N);
toposort(N);
system("pause");
return 0;
}
/* functions definition */
void get_into_degree(int n)
{
for(int j = 0; j < n; ++j)
{
into[j] = 0;
for(int i = 0; i < n; ++i)
{
if(matrix[i][j] == 1)
{
into[j]++;
}
}
}
}
void toposort(int n)
{
//需要輸出n個結點,排序結束
for(int i = 1; i <= n; ++i)
{
int j = 0;
while(j < n && into[j] != 0) j++;
//找到度為0的點
cout << j + 1 << " ";
//更新度
into[j] = N ;//設結點j為最大度,以免再次輸出j
for(int k = 0; k < n; ++k)
{
if(matrix[j][k] == 1)
{
into[k]--;
}
}
}
}
參考資料 [1]信息技術競賽輔導,作者不詳
[2]百度百科,拓撲排序