下面是我在教科书上写的对队列中的拓扑排序算法的阅读:
void topologicalsort(struct Graph* G){
struct queue* Q;
int counter;
int v,w;
Q=createqueue();
counter=0;
for(v=0;v<G->V;v++){
if(indegree[v]==0)
enqueue(Q,v);
while(!isemptyqueue(Q)){
v=dequeue(Q);
topologicalorder[v]=++counter;
for each w to adjacent to v
if(--indegree[w]==0){
enqueue(Q,w);
}
}
}
}
以下图形的算法失败:
如果在给定图中最初7 5 3的度数为零,则它们将插入队列中,但是对于与7 5 3
相邻的任何顶点,我们没有任何度数为1的顶点。这意味着if(--indegree[w]==0)
对于7 5 3
不成立,因此队列中将没有进一步的排队,因此该算法将不再处理其他顶点。 我想知道如果图形是DAG,为什么算法会失败?哪种方式不正确?
我知道我们也可以使用DFS实现拓扑排序,但是我想按原样实现以下内容:
答案 0 :(得分:2)
您的算法实现不正确。这里的while(!isemptyqueue(Q))
不在for(v=0;v<G->V;v++)
下(请参见算法中的缩进)。请参阅下面的更多说明:
void topologicalsort(struct Graph* G){
struct queue* Q;
int counter;
int v,w;
Q=createqueue();
counter=0;
for(v=0;v<G->V;v++){
if(indegree[v]==0)
enqueue(Q,v);
}
while(!isemptyqueue(Q)){
v=dequeue(Q);
topologicalorder[v]=++counter;
for each w to adjacent to v {
if(--indegree[w]==0){
enqueue(Q,w);
}
}
}
}
这将适用于每个DAG。