C++ 有向图中的前后边

C++ 有向图中的前后边,c++,C++,我是图论新手。我正在编写一个代码来查找有向图中的所有前向和后向边。我搜索并实现了如下代码。 我的代码将进入无限循环。 你能看一下吗。我们将非常感谢你 void dfsVisit(u) { u->color="gray"; u->time=count; count++; for(every child node v of u) { if(v->color == "bl

我是图论新手。我正在编写一个代码来查找有向图中的所有前向和后向边。我搜索并实现了如下代码。 我的代码将进入无限循环。 你能看一下吗。我们将非常感谢你

void dfsVisit(u)
      {
        u->color="gray";
        u->time=count;
        count++;
        for(every child node v of u)
        {
           if(v->color == "black")
           {
              if(u->time < v->time)
                  cout<<"Edge "<<u<<"->"<<v<<" is forward edge"<<endl;
              else
                  cout<<"Edge "<<u<<"->"<<v<<" is cross edge"<<endl;
            }
            if(v->color == "gray")
                 cout<<"Edge "<<u<<"->"<<v<<" is back edge"<<endl;
           if(v->color == "white")
                 cout<<"Edge "<<u<<"->"<<v<<" is tree edge"<<endl;
          dfsVisit(v); 
         }
         u->color="black";
         u->time=count;
         count++;
    }
void DFS访问(u)
{
u->color=“gray”;
u->时间=计数;
计数++;
对于(u的每个子节点v)
{
如果(v->颜色==“黑色”)
{
如果(u->timetime)

我发现您的代码可能存在两个问题:

  • 您可以为每个子级调用
    dfsVisit
    ,而不管其颜色如何。您将其缩进更深的层次,但没有在白色if周围添加任何括号-基于此伪代码,只有
    cout
    受if语句的影响。 但由于这只是一个伪代码,所以你应该把你写的C++代码张贴出来。 <>你在你的条件下有三种颜色(灰色、黑色和白色),但是你从来没有设置过白色。你的边在调用<代码> dfsVisual//>之前被初始化为白色(你应该考虑使用EnUM或EnUM类的颜色,这是干净的,并且你不太可能用TyPs造成错误)


  • 我发现您的代码可能存在两个问题:

  • 您可以为每个子级调用
    dfsVisit
    ,而不管其颜色如何。您将其缩进更深的层次,但没有在白色if周围添加任何括号-基于此伪代码,只有
    cout
    受if语句的影响。 但由于这只是一个伪代码,所以你应该把你写的C++代码张贴出来。 <>你在你的条件下有三种颜色(灰色、黑色和白色),但是你从来没有设置过白色。你的边在调用<代码> dfsVisual//>之前被初始化为白色(你应该考虑使用EnUM或EnUM类的颜色,这是干净的,并且你不太可能用TyPs造成错误)


  • 您必须以某种方式对访问的边进行成员化。以两个节点的循环为例。第一个节点被访问,它下降为“向下”到第二个,然后返回到第一个,然后再次访问第二个。是的,你是对的。我已经标记了所访问的节点。现在我唯一的问题是交叉边和前向边之间。我认为在将节点标记为黑色时,逻辑上存在一些问题。
    用于(u的每个子节点v)什么
    mean?发布您的完整代码。这意味着对于节点u的所有子节点,v被用于引用u的一个子节点。
    不是任何C++代码。它是被编辑的吗?还是原来的源代码中的这个代码?你必须在某种程度上访问访问的边。举一个两个节点的循环的例子。第一个是访问的,它是向下的。到第二个,然后返回到第一个,然后再次访问第二个。是的,你是对的。我已经标记了所访问的节点。现在我唯一的问题是交叉边和前向边之间。我认为在将节点标记为黑色时,逻辑上存在一些问题。
    用于(u的每个子节点v)什么
    mean?发布您的完整代码。这意味着对于节点u的所有子节点,v被用于引用u的一个子节点。
    <代码>不是任何一种C++代码。它是编辑的吗?还是原来的源代码中的代码?这里是原始C++代码。在DSFFACK函数之前,我已经初始化了白色的顶点。如果这是原始代码(除了for循环,那不是C++),如果用{}(请看我的第一条注释),你应该把你的第三包围起来。这里是原始的C++代码。在DSFACK函数之前,我已经初始化了白色的顶点。如果这是原始代码(除了for循环,那不是C++),你应该用{}包围你的第三(参见我的第一个评论)。