示意图
待补充。。。
结构定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
#define MAXVEX 100
typedef char VertexType; typedef int EdgeType;
typedef struct edgeNode { int adjvex; struct edgeNode * next; } EdgeNode;
typedef struct vertex { VertexType data; EdgeNode * firstedge; int in; } VertexNode;
typedef VertexNode AdjList[MAXVEX];
typedef struct { AdjList adjList; int numVex, numEdge; } ALGraph;
|
重点
拓扑排序目的:
在各为各的前提条件的无环复杂网络中,如何在不违背所有前提条件的情况下,把各个事件依次排好序,这就是拓扑排序的目的。
拓扑排序思路:
依次找出入度为0(即没有前提条件了)的顶点(事件),然后执行该事件,并删除以该点为弧尾的弧(即弧头顶点入度减1)。
为了避免每次都要循环遍历查找入度是否为0,则采用栈,将入度为0的顶点保存到栈中,后续从栈中直接取出,无需遍历查找。
源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
|
#include <stdio.h> #include <stdbool.h> #include <stdlib.h>
#define MAXVEX 100
typedef char VertexType; typedef int EdgeType;
typedef struct edgeNode { int adjvex; struct edgeNode * next; } EdgeNode;
typedef struct vertex { VertexType data; EdgeNode * firstedge; int in; } VertexNode;
typedef VertexNode AdjList[MAXVEX];
typedef struct { AdjList adjList; int numVex, numEdge; } ALGraph;
bool TopologicalSort(ALGraph *G) { int * Stack = malloc(sizeof(int) * G->numVex); if ( NULL == Stack ) { printf("建栈失败!\n"); exit(-1); } int top = -1;
for ( int i = 0; i < G->numVex; i++ ) { if ( 0 == G->adjList[i].in ) { Stack[++top] = i; } }
int getTop; int count; while ( top != -1 ) { getTop = Stack[top--]; printf("%c->", G->adjList[getTop].data); count++;
EdgeNode * p = G->adjList[getTop].firstedge; while ( p != NULL ) { if ( 0 == --G->adjList[p->adjvex].in ) { Stack[++top] = p->adjvex; } p = p->next; } }
if ( count < G->numVex ) { return false; } return true; }
|