看到很多都说用DFS,若一个顶点被第二次访问到,则有回路。那么问题来了:若顶点A、B都到顶点C有边,那么用DFS的话顶点C就会被第二次访问到,但是图中却没有回路啊。
有些想不通,请大神们指教
这个也是两条路啊。
如果用一个现在走过的节点集合来给示的话 a ,c 。。。。 当回退回去的时候c是会被出栈的,直到a出栈加下b ,再会又到c.所以不会影响结果的。
总而言之C还是访问了两次不是么?我之前疑惑的是为什么说若一个顶点被第二次访问到则说明有回路。现在我已经弄清楚了
是我理解有点问题,应该是针对每一个分支而言的,若分支的根节点在该分支中被第二次访问到,则有回路,针对数据结构书上的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);
}
应该是针对每一个分支而言的,若分支的根节点在该分支中被第二次访问到,则有回路,针对数据结构书上的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);
}