进行拓扑排序的方法:
-在有向图中选一个没有前驱的顶点且输出;
-从图中删除该节点和所有以该结点为尾的狐;
-重复以上操作,若可以输出全部节点,则该图中不存在环,否则存在环;
例如:
算法实现:
-以临界点的方法存储有向图;
-头结点增加信息;定点入度;
-增加一个栈,存放入度为0的结点
只要栈不空。至少有一个顶点。
输出有向图的拓扑序列的算法
Status TopologicalSort(AL Graph G){
FindInDegree(G,indegree);
InitStack(S);//初始化一个栈
for(i=0;i<G,vexnum;++i) if(indegree[i])Push(S,i);//如果入度为0,就入栈
count = 0;
while(!StackEmpty(S)){//栈不空。就取栈顶元素,
Pop(S,i);printf(i,G.vertics[i].data);++count;
for(p=G.vertics[i].firstarc;p;p=p->nextarc)//下一个临界点
{k=p->adjvex;//k是每一个临接点
if(!(--indegree[k])push(S,k));}//每一个临界点的入度减一,等于0的话就入栈
}
if(count<G.vexnum) return ERROR;//如果有结点没有访问打,说明存在环
else return OK;
}