bool TopologicalSort(ALGraph G){
SqStack S;InitStack(S);
ArcNode *p;
int i,count=0; //计数,记录当前已经输出的顶点数
int indegree[G.vexnum],print[G.vexnum];//入度的输入省去
for(i=0;i<G.vexnum;i++){
if(indegree[i]==0)
Push(S,i); //将所有入度为0的节点入栈
}
while(!IsEmpty(S)){ //栈非空,存在入度为0的节点
Pop(S,i);print[count++]=i; //输出顶点i
for(p=G.vertices[i].first;p;p=p->next){
//将所有i指向的顶点的入度减1,并将入度减为0的顶点入栈
int v=p->adjvex;
if(!(--indegree[v])) //入度减少
Push(S,v); //入度为0,入栈
}
}
if(count<G.vexnum) //只输出了部分节点,即当前网中不存在无前驱的顶点,即图中有回路
return false; //拓扑排序失败
else
return true;
}
拓扑排序代码
于 2024-01-15 17:24:20 首次发布