AOV網:在一個表示工程的有向圖中,用頂點表示活動,用弧表示活動之間的優先關係,這樣的有向圖爲頂點表示活動的網,我們稱爲AOV網。
拓撲序列:設G={V, E}是具有n個頂點的有向圖,V中的頂點序列v1, v2, ……vn,滿足若從頂點vi到vj有一條路徑,,則在頂點序列中頂點vi必須在頂點vj之前,則我們稱這樣頂點序列爲一個拓撲序列。
拓撲排序:所謂拓撲排序,其實就是對一個有向圖構造拓撲序列的過程。構造時會有兩個結果,如果此網的全部頂點都被輸出,則說明它是不存在環的AOV網,如果輸出頂點數少了,哪怕是少了一個,也說明這個網存在迴路,不是AOV網。
拓撲排序算法:從AOV網中選擇一個入度爲0的頂點輸出,然後刪去此頂點,並刪除以此頂點爲尾的弧,繼續重複此步驟,直到輸出全部頂點或者AOV網中不存在入度爲0的 頂點爲止。這個算法是時間複雜度是O(n+e)。
在算法中,需要輔助的數據結構——棧,用來存儲處理過程中入度爲0的頂點,目的是爲了避免每個查找時都要去遍歷頂點表找有沒有入度爲0的頂點。
typedef struct EdgeNode
{
int adjvex;
int weight;
struct EdgeNode *next;
} EdgeNode;
typedef struct VertexNode
{
int in;
int data;
EdgeNode *firstedge;
} VertexNode, AdjList[MAXVEX];
typedef struct
{
AdjList adjList;
int numVertexes, numEdges;
} graphAdjList, *GraphAdjList;
Status TopologicalSort(GraphAdjList GL)
{
int i, k, gettop;
int count = 0;
int *stack;
int top = 0;
EdgeNode *e;
stack = (int *)malloc(GL->numVertexes * sizeof(int));
for (i = 0; i < GL->numVertexes; i++)
if (GL->adjList[i].in == 0)
stack[++top] = i;
while (top != 0)
{
gettop = stack[top--];
count++;
printf("%d -> ", GL->adjList[gettop].data);
for (e=GL->adjList[gettop].firstedge; e; e = e->next)
{
k = e->adjvex;
if (!(--GL->adjList[k].in))
stack[++top] = k;
}
}
if (count < GL->numVertexes)
return ERROR;
else
return OK;
}