拓补排序
//拓补排序
bool TopologicalSort(Graph G) {
Initstack(S);//初始化栈,存储入度为0的顶点
for (int i = 0; i < G, vexnum; i++) {
if (indegree[i] == 0)
Push(S, i); //将所有入度为0的顶点进栈
}
int count = 0;//计数当前已经输出的顶点数
while (!IsEmpty(S)) {//栈不空,则存在入度为0的顶点
Pop(S, i);//栈顶元素出栈
print[count++] = i;//输出顶点i
for (p = G.vertices[i].firstarc; p; p = p->nextarc) {
//将i所指向的顶点的入度减1,并且将入度减为0的顶点压入栈S
v = p->adjvex;
if (!(--indegree[v]))
Push(S, v);//入度为0,则入栈
}
}
if (count < G.vexnum)
return false;//排序失败,有向图中有回路
else
return true;//拓补排序成功
}
逆拓补排序
//逆拓补排序的实现(DFS算法)
void DFSTraverse(Graph G) {
for (v = 0; v < G.vexnum; ++v)
visited[v] = false;
for (v = 0; v < G.vexnum; ++v)
if (!visited[v])
DFS(G, v);
}
void DFS(Graph G, int v) {//从顶点v出发,深度优先遍历图G
visit(v);//访问初始顶点v
visited[v] = true;//对v做已访问标记
for (w = FirstNeighbor(G, v); w >= 0; w = NextNeighbor(G, v, w)) {
if (!visited[w]) {//w为v的尚未访问的邻接顶点
DFS(G, w);
}
}
print(v);//输出顶点
}