C 图中使用队列的拓扑排序

C 图中使用队列的拓扑排序,c,algorithm,sorting,graph-theory,depth-first-search,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(!isempty

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

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


       }
    } 
} 
void拓扑排序(结构图*G){
结构队列*Q;
整数计数器;
int v,w;
Q=createqueue();
计数器=0;
对于(v=0;vV;v++){
if(indegree[v]==0)
排队(Q,v);
而(!isemptyqueue(Q)){
v=出列(Q);
拓扑顺序[v]=++计数器;
对于每个w到相邻v
如果(--indegree[w]==0){
排队(Q,w);
}
}
} 
} 
以下图形的算法失败:

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

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


您的算法实现不正确。此处为
,而(!isemptyqueue(Q))
不在(v=0;vV;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);
             }
         }
    }
}
void拓扑排序(结构图*G){
结构队列*Q;
整数计数器;
int v,w;
Q=createqueue();
计数器=0;
对于(v=0;vV;v++){
if(indegree[v]==0)
排队(Q,v);
}
而(!isemptyqueue(Q)){
v=出列(Q);
拓扑顺序[v]=++计数器;
对于每个w到相邻v{
如果(--indegree[w]==0){
排队(Q,w);
}
}
}
}

这将适用于每个DAG。

您的算法实现不正确。此处为
,而(!isemptyqueue(Q))
不在(v=0;vV;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);
             }
         }
    }
}
void拓扑排序(结构图*G){
结构队列*Q;
整数计数器;
int v,w;
Q=createqueue();
计数器=0;
对于(v=0;vV;v++){
if(indegree[v]==0)
排队(Q,v);
}
而(!isemptyqueue(Q)){
v=出列(Q);
拓扑顺序[v]=++计数器;
对于每个w到相邻v{
如果(--indegree[w]==0){
排队(Q,w);
}
}
}
}


这将适用于每个DAG。

此外,没有
struct queue
struct Graph
createqueue()
dequeue()
enqueue()
indegree
的定义痕迹,而且该代码甚至无效<代码>对于每个w到…
?如果您只是在使用psuedo代码,为什么会将其标记为C?提供的算法是类似于C的psuedo代码,您需要使用您选择的任何语言(如C)来实现它。标点符号非常重要。同样重要的是要记住,我们不欠你任何东西。虽然这是一个合理的问题,但从根本上来说,这只是一个打字错误——从文本到代码的简单转录错误。这会使这个问题偏离主题。也许它应该保持原样,因为它所指的教科书很受欢迎,而且不止一个人可能会被它抛弃。请在问题本身中包含教科书的作者和标题,以便人们在搜索此问题时会有更轻松的时间。此外,
struct queue
struct Graph
createqueue()
dequeue()
enqueue()的定义没有任何痕迹
indegree
…加上该代码甚至无效<代码>对于每个w到…
?如果您只是在使用psuedo代码,为什么会将其标记为C?提供的算法是类似于C的psuedo代码,您需要使用您选择的任何语言(如C)来实现它。标点符号非常重要。同样重要的是要记住,我们不欠你任何东西。虽然这是一个合理的问题,但从根本上来说,这只是一个打字错误——从文本到代码的简单转录错误。这会使这个问题偏离主题。也许它应该保持原样,因为它所指的教科书很受欢迎,而且不止一个人可能会被它抛弃。请在问题中包含教科书的作者和标题,这样人们在搜索这个问题时会更容易。在书中,他们删除了
for
-循环的尾随括号,OP错误地将
的花括号括起来,而将
循环与
for
-循环混淆。。。因此,表示用花括号开始代码块的主要重要性之一…@Ruks你是对的。我不得不面对很多次这样的问题。最初看到你的循环将在队列中插入
7 5 3
,之后你将进入
循环,直到现在你在队列中有
7 5 3
,现在你将从队列中一个接一个地出列,为了进一步入列,必须执行此语句
如果(--indegree[w]==0)
要执行此操作,我们必须有一个与
7
5
3
具有indegree
1
的顶点相邻
11 8 10
中的哪个顶点具有indegree 1@nightfury1204@newby我加了花括号,这说明了什么?如果(--indegree[w]==0),则执行
。同样
如果(--indegree[w]==0)
表示
--indegree[w];如果(indegree[w]==0))
这里11 8和10的indegree是2还是1?谢谢你的帮助,我来自印度@Nightfury1204在书中,他们删除了
fo后面的括号