對有向無環圖(DAG)的頂點排序,使得若存在路徑 `u → v`,則 `u` 在 `v` 之前。應用:任務調度、編譯依賴、課程先修關係。
以頂點 A-G、邊 `
#define MAX 100
class ListDG {
struct ENode { int ivex; ENode* nextEdge; };
struct VNode { char data; ENode* firstEdge; };
int mVexNum, mEdgNum;
VNode mVexs[MAX];
public:
ListDG(char vexs[], int vlen, char edges[][2], int elen); // 從數據構建
int topologicalSort(); // 返回 0 成功,1 有環,-1 內存錯誤
};
int ListDG::topologicalSort() {
int *ins = new int[mVexNum](); // 入度
int *queue = new int[mVexNum];
char *tops = new char[mVexNum];
int head = 0, rear = 0, index = 0;
// 統計入度
for (int i = 0; i < mVexNum; i++)
for (ENode* p = mVexs[i].firstEdge; p; p = p->nextEdge)
ins[p->ivex]++;
// 入度 0 入隊
for (int i = 0; i < mVexNum; i++)
if (ins[i] == 0) queue[rear++] = i;
// BFS
while (head != rear) {
int j = queue[head++];
tops[index++] = mVexs[j].data;
for (ENode* p = mVexs[j].firstEdge; p; p = p->nextEdge) {
if (--ins[p->ivex] == 0) queue[rear++] = p->ivex;
}
}
if (index != mVexNum) { /* 有環 */ return 1; }
// 輸出 tops...
delete[] ins; delete[] queue; delete[] tops;
return 0;
}