拓撲排序

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;
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章