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
具有indegree1
的顶点相邻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后面的括号