若不是上了學堂在線的數據結構課程,我估計今后不做技術的話,都接觸不到圖的拓撲排序這個概念了。先是看了百度百科的解釋,拓撲排序現實中的應用是選課,即某些課程需要一些先修課程的學習后才適合上。比如數據結構的學習,是離散數學、編程語言,后者是前者的先修課程。
拓撲排序定義:將有向無環圖DAG中的頂點以線性方式進行排序。即對於任何連接自頂點u到頂點v的有向邊uv,在最后的排序結果中,頂點u總是在頂點v的前面。
1.創建圖;
2.將圖中入度為0的頂點壓入棧中;
3.將棧頂元素出棧,並將其鄰接頂點的入度減1,若該鄰接頂點的入度等於0,將該鄰接頂點入棧;否則將邊更新為棧頂元素的另一條邊。
4.重復3,直至棧空。
一道關於OJ上的旅行商的問題,對圖中可能通過的點的最大個數進行統計。實質是拓撲排序,但並不完全是排序,這里需要對一條通路上的頂點個數進行統計。
如圖所示,1~6個村庄,但不是任意兩個村庄之間都能相通,統計最長道路經過的村庄數,此時該結果為4.
以下是deadline截止前寫的,但OJ提交后沒有結果,只有一個compilation error編譯錯誤的指示。codeblocks上測試了幾個是通過的,或許還有錯誤吧,不過稍微能理解圖的創建和拓撲排序了。
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <iostream> 4 #define MAX_VEX 1000001 //頂點 5 6 #define _Size 100000 //棧的大小 7 8 struct Stack{ 9 int *element; 10 int top; 11 int _size; 12 13 void initialStack(){ 14 element = new int[_Size]; 15 top = -1; 16 _size = _Size; 17 } 18 void push(int x){ 19 element[++top] = x; 20 } 21 int pop(){ 22 return element[top--]; 23 } 24 }S; 25 26 27 typedef struct edgeNode { 28 int adjvex; 29 // int num; 30 edgeNode *nextedge; 31 }edgeNode; 32 33 typedef struct vexNode{ 34 int data; 35 edgeNode *firstedge; 36 int inDegree = 0; //入度初始為0 37 }vexNode; 38 39 typedef struct vexList{ 40 vexNode vexlist[MAX_VEX]; 41 int vexnum, edgenum; 42 }vexList; 43 44 void GraphList(vexList &G, int n, int m){ 45 G.edgenum = m; 46 G.vexnum = n; 47 for (int i = 1; i < n + 1; i++){ 48 G.vexlist[i].data = i; // 頂點從1~n; 49 G.vexlist[i].firstedge = NULL; 50 51 } 52 for (int i = 0; i < m ; i++){ // 有向邊 53 int from, to; 54 scanf("%d %d", &from, &to); 55 edgeNode *p = new edgeNode; 56 p->adjvex = to; 57 p->nextedge = G.vexlist[from].firstedge; 58 G.vexlist[from].firstedge = p; 59 } 60 } 61 62 int Tsort(vexList &G){ 63 // Stack; 64 S.initialStack(); 65 edgeNode *p; 66 int cnt = 1; 67 for (int i = 1; i < G.vexnum + 1; i++){ 68 p = G.vexlist[i].firstedge; 69 while (p){ 70 G.vexlist[p->adjvex].inDegree++; 71 //G.vexlist[i].firstedge->num++; 72 p = p->nextedge; 73 } 74 } 75 for (int i = 1; i < G.vexnum + 1; i++){ 76 if(G.vexlist[i].inDegree == 0){ 77 S.push(i); 78 } 79 } 80 while (S.top != -1){ 81 int j = S.pop(); 82 //cnt++; 83 p = G.vexlist[j].firstedge; 84 while (p){ 85 G.vexlist[p->adjvex].inDegree--; 86 // G.vexlist[j].firstedge->num--; 87 if (G.vexlist[p->adjvex].inDegree == 0 && p->nextedge == NULL){ 88 S.push(p->adjvex); 89 cnt++; 90 } 91 92 p = p->nextedge; 93 } 94 } 95 return cnt; 96 } 97 vexList G; 98 int main(){ 99 int n, m; 100 int cnt = 0; 101 scanf("%d %d", &n, &m); 102 GraphList(G, n, m); 103 cnt = Tsort(G); 104 printf("%d", Tsort(G)); 105 return 0; 106 }