首页 新闻 会员 周边 捐助

判断有向图是否有回路的问题

0
悬赏园豆:5 [待解决问题]

看到很多都说用DFS,若一个顶点被第二次访问到,则有回路。那么问题来了:若顶点A、B都到顶点C有边,那么用DFS的话顶点C就会被第二次访问到,但是图中却没有回路啊。

有些想不通,请大神们指教

c++
shrimp_929的主页 shrimp_929 | 初学一级 | 园豆:198
提问于:2017-04-05 10:28
< >
分享
所有回答(3)
1

这个也是两条路啊。

如果用一个现在走过的节点集合来给示的话 a ,c 。。。。 当回退回去的时候c是会被出栈的,直到a出栈加下b ,再会又到c.所以不会影响结果的。

gw2010 | 园豆:1487 (小虾三级) | 2017-04-05 13:57

总而言之C还是访问了两次不是么?我之前疑惑的是为什么说若一个顶点被第二次访问到则说明有回路。现在我已经弄清楚了

支持(0) 反对(0) shrimp_929 | 园豆:198 (初学一级) | 2017-04-05 16:29
0

是我理解有点问题,应该是针对每一个分支而言的,若分支的根节点在该分支中被第二次访问到,则有回路,针对数据结构书上的DFS实现,我做了一点点改变,就可以实现判断了,以下是代码

void DFS(Graph* G, int v)

{

  for(int w=G->first(v);w<G->n();w=G->next(v,w))

 {

      if(G->getMark(w)==unvisited)

          DFS(G,w);

 }

 if(G->getMark(v)==visited)

   有回路

 else

    G->setMark(v);

}

shrimp_929 | 园豆:198 (初学一级) | 2017-04-05 16:35
0

应该是针对每一个分支而言的,若分支的根节点在该分支中被第二次访问到,则有回路,针对数据结构书上的DFS实现,我做了一点点改变,就可以实现判断了,以下是代码

void DFS(Graph* G, int v)

{

  for(int w=G->first(v);w<G->n();w=G->next(v,w))

 {

      if(G->getMark(w)==unvisited)

          DFS(G,w);

 }

 if(G->getMark(v)==visited)

   有回路

 else

    G->setMark(v);

}

fcyh | 园豆:568 (小虾三级) | 2017-07-14 17:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册