拓补排序简介
对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前
首先需要知道一个概念:入度。
通常指有向图中某点作为图中边的终点的次数之和。
比如:
节点 | A | B | C | D | E |
---|---|---|---|---|---|
入度 | 0 | 1 | 1 | 1 | 3 |
实现过程
对图进行深度优化搜索,将顶点放入数组中,改变与之连接的下个节点的入度。
图片取自:拓扑排序(Topological Sorting)
代码实现
核心代码:
BOOLEAN isInTop(VTYPE *topNum, int length, VTYPE key) {
for (int i = 0; i < length; i++) {
if (topNum[i] == key) {
return TRUE;
}
}
return FALSE;
}
int degreePos(AdjGraphPtr adj, VTYPE *topNum , int length) {
int pos = -1;
for (int i = 0; i < adj->vNum; i++) {
if (adj->vertexList[i]->degree == 0) {
if (isInTop(topNum, length, adj->vertexList[i]->v) == FALSE) {
pos = i;
return pos;
}
}
}
return pos;
}
int getEmptyPos(VTYPE *topNum, int length) {
//获得未使用的位置
for (int i = 0; i < 5; i++) {
if (topNum[i] == 0) {
return i;
}
}
return -1;
}
int dfs(AdjGraphPtr adj, VTYPE *topNum, int length, int pos) {
EdgePtr tmp = adj->vertexList[pos]->firstEdge;
while (tmp != NULL) {
VTYPE w = tmp->w;
int w_pos = getVertexPos(adj, w);
adj->vertexList[w_pos]->degree--;
if (adj->vertexList[w_pos]->degree == 0)
continue;
if (isInTop(topNum, length, w) == FALSE) {
int emptyPos = getEmptyPos(topNum, length);