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++),你应该用{}包围你的第三(参见我的第一个评论)。