【图】拓扑排序
若不是上了学堂在线的数据结构课程,我估计今后不做技术的话,都接触不到图的拓扑排序这个概念了。先是看了百度百科的解释,拓扑排序现实中的应用是选课,即某些课程需要一些先修课程的学习后才适合上。比如数据结构的学习,是离散数学、编程语言,后者是前者的先修课程。
拓扑排序定义:将有向无环图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 }