1. 程式人生 > 其它 >圖的拓撲排序問題

圖的拓撲排序問題

技術標籤:資料結構演算法c++c語言

描述:

在有向無環圖,頂點之間存在先後關係,遍歷某個頂點前必須前遍歷其前驅頂點。
拓撲排序一般應用於計劃的安排:完成一項任務後才可進行下一項。

思路:

輸出圖中入度為0的頂點,並記錄其下標,之後刪除該頂點所連線的弧,重複這個過程直到圖中找不到入度為0的頂點為止。

如果執行完演算法後圖中還有頂點沒有輸出,則說明圖中存在環,輸出錯誤資訊。

程式碼:
//鄰接矩陣的定義
typedef struct AMGraph
{
    int vex[ARRAYSIZE]={0};//頂點陣列
    int arc[ARRAYSIZE][ARRAYSIZE];//二維陣列,表示頂點之間的關係
int vexnum=0,arcnum=0;//頂點個數和弧個數 int type=0;//1表示無向圖,2表示有向圖,3表示無向網,4表示有向網 }AMGraph; int GetInDegree(AMGraph &G,int e);//求頂點的入度
//拓撲排序
void topo_sort(AMGraph &G)
{
    int num=-1;//用於表示當前頂點的下標
    set<int> record;//用於記錄已處理的頂點的下標的容器
    //尋找入度為0的頂點
    for(int i=0;i<G.vexnum;i++)
    {
        if
(GetInDegree(G,G.vex[i])==0) num=i; } int n=record.size(); while(num!=-1 && n!=G.vexnum) { cout << G.vex[num] << endl; record.insert(num);//記錄已處理的頂點的下標 //刪除該頂點所連線的弧 for(int i=0;i<G.vexnum;i++) { if(G.type==
2) G.arc[num][i]=0; else if(G.type==4) G.arc[num][i]=INT_MAX; } num=-1; //尋找入度為0的頂點 for(int i=0;i<G.vexnum;i++) { //檢測第i個頂點是否已處理過,有則continue if(record.find(i)==record.end()) { if(GetInDegree(G,G.vex[i])==0) { num=i; break; } } else continue; } } if(n!=G.vexnum)//退出迴圈後若圖中還有頂點未輸出,說明圖中存在環 { cout << "出錯!圖中存在環" << endl; } }