版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
本文针对无向图的判环问题进行论述。
无向图判断环的存在很容易。注意,这里不要求无向图是连通图,如果无向图中的任一连通分量中有环,就说无向图中存在环。
1. DFS
对于无向图来说,如果深度优先遍历过程中遇到回边,即指向已经访问过的顶点的边,就必定存在环。
(1) 判断环的存在
利用DFS判断无向图中是否存在环,是最常用的一种方法。我们对每个未访问过的顶点运行DFS,这会在该顶点所处的连通分量上产生一棵深度优先生成树,图中存在环当且仅当树上存在回边back edge,这条回边要么关联自己(自环边),要么关联深度优先生成树上该顶点的某个祖先结点。
为了找到连通祖先结点的回边,我们使用一个visited数组,如果有一条指向已经访问过的顶点的回边,那么就有环,我们返回true。
无向图DFS判断环的算法步骤如下:
使用给定的边数和顶点数创建一个图;使用一个递归函数,访问当前的顶点,标记当前的顶点为访问过;找到当前顶点的所有未访问的邻接点,递归调用函数访问这些顶点,如果递归函数返回true,就直接返回true,不再进行下一步;如果某些邻接点不是父结点但却已经被访问和标记过,我们就返回true,否则最后返回false;创建一个wrapper函数,对无向图中所有未访问过的顶点,都调用该递归函数;如果对任一顶点,递归函数返回true,就返回true;如果对所有顶点,递归函数都返回false,才返回false。
需要注意的是:这里是简单图,不允许自环的存在;另外,对于一条边关联的两个顶点,DFS时从一个顶点u访问其邻接点v,u在深度优先生成树上是v的父结点,然后对v访问其邻接点时需要特判u。
代码如下:
#includeusingnamespace std;//判断在一张无向图中是否存在环//无向图邻接表classGraph{private:int numVertexes;//顶点编号数0-numVertexes list