使用图形中的队列进行拓扑排序

时间:2018-11-08 06:05:55

标签: c algorithm sorting graph-theory depth-first-search

下面是我在教科书上写的对队列中的拓扑排序算法的阅读:

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);
             }


       }
    } 
} 

以下图形的算法失败:

graph the algorithm fails on

如果在给定图中最初7 5 3的度数为零,则它们将插入队列中,但是对于与7 5 3相邻的任何顶点,我们没有任何度数为1的顶点。这意味着if(--indegree[w]==0)对于7 5 3不成立,因此队列中将没有进一步的排队,因此该算法将不再处理其他顶点。 我想知道如果图形是DAG,为什么算法会失败?哪种方式不正确?

我知道我们也可以使用DFS实现拓扑排序,但是我想按原样实现以下内容:

the pseudocode of the algorithm I want to implement

1 个答案:

答案 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。