當前位置: 首頁>>算法&結構>>正文


拓撲排序算法(鄰接矩陣版)(C++實現)

摘要:本文簡要介紹了拓撲排序算法的原理,並給出了基於鄰接矩陣實現的拓撲排序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]百度百科,拓撲排序

本文由《純淨天空》出品。文章地址: https://vimsky.com/zh-tw/article/189.html,未經允許,請勿轉載。