基本思想:
(1) 选择一个入度为0的顶点并输出之;
(2) 从网中删除此顶点及所有出边。
直到不存在入度为0的顶点为止。循环结束后,若输出的顶点数小于网中的顶点数,则“有回路”,否则输出的顶点序列就是一种拓扑序列。
bool TPSort(Graph G){
InitStack(S); //调用栈
for(int i=0;i<G.vexnum;i++)
if(indegree[i]==0) //入度为0的顶点,入栈
Push(S,i);
int count=0;
while(!IsEmpty(S)){
Pop(S,i);
print[count++]=i; //输出数组print[]从0记录每一个出栈顶点的序号
for(p=G.vertices[i].firstarc;p;p=p->nextarc){ //输出顶点的所有邻接顶点入度-1
v=p->adjvex;
if(!(--indegree[v])) //入度为0,入栈;(0不执行所以!0即入度为0执行)
Push(S,v);
}
}
if(count<G.vexnum)
return false;
else //所有顶点全部输出了
return true;
}