拓扑序列
由一个有向无环图的顶点组成的序列,其满足:
1、每个顶点出现且仅出现一次;
2、若顶点A在序列中排到顶点B的前面,则图中不存在从顶点B到顶点A的路径。
int indegree[MaxVertexNum];//各个结点的入度
VertexType TopologicalOrder[MaxVertexNum];//保存拓扑序列
bool TopologicalSort(ALGraph G) { //拓扑排序
queue<VertexType> Q; //保存度为0的顶点
int count = 0;//拓扑序列中的顶点数
for (int i = 0; i < G.VertexNum; ++i) { //入度为0的顶点压入队列
if (indegree[i] == 0)
Q.push(i);
}
while (!Q.empty()) {
VertexType temp = Q.front();
Q.pop();
TopologicalOrder[count++] = temp;//当前顶点加入拓扑序列
for (EdgeNode *p = G.adjList[temp].FirstEdge; p != NULL; p = p->next) {//依次扫描当前顶点的边表结点
VertexType V = p->AdjVertex;
indegree[V]--;//将与之邻接的顶点的入度减1
if (indegree == 0)//如果入度减到0,则顶点入队
Q.push(V);
}
}
if (count < G.VertexNum) return false;
else return true;
}
注:以上代码基于邻接表存储的图。