拓扑排序的思想很简单,对于一个有向图,首先找到一个入度为0的点,然后在这个有向图中删掉该点,更新其他结点的入度,在第二次循环中再次寻找一个入度为0的点,循环进行,知道找到了结点的最大值n个点即可完成拓扑排序,如果在此过程中某时刻未能找到入度为0的点,则拓扑排序失败。
template<class EdgeType>
bool Graph<EdgeType>::TopologySort(int *SortArray) {
//SortArray是排序结果的写入始祖数组
int n = VerticesNum();
int* indegree = new int[n];
//保存结点入度
Edge<EdgeType> e;
int v;
for (int i = 0; i < n; i++) {
indegree[i] = 0;
Mark[i] = UNVISITED;
}
for (v = 0; v < n; v++) {
for (e = FirstEdge(v); IsEdge(e); e = NextEdge(e)) {
indegree[EndVertex(e)]++;
}
}
for (int i = 0; i < n; i++) {
for (v = 0; v < n; v++) {
if (indegree[v] == 0 && Mark[v] == UNVISITED) {
break;
}
}
if (v == n) {
//找不到入度为0的结点
return false;
}
else { //找到入度为0的结点
Mark[v] = VISITED;
SortArray[i] = v;
for (Edge<EdgeType> e = FirstEdge(v); IsEdge(e); e = NextEdge(e)) {
//FirstEdge(int v),IsEdge(EdgeType e),NextEdge(EdgeType e)三个函数皆为当前
//类中定义的函数,具体实现可以查看我的图的构建的博客
indegree[EndVertex(e)]--;
}
}
}
delete []indegree;
//删除辅助数组以释放内存空间
return true;
}