1 检查该图是否包含循环
给定一个有向图,检查该图是否包含循环。如果给定的图形至少包含一个循环,则函数应返回true,否则返回false。
方法:深度优先遍历可用于检测图中的循环。连接图的DFS生成树。只有当图中存在后缘时,图中才存在循环。后边是从节点到自身(自循环)或DFS生成的树中其祖先之一的边。在下图中,有3条后缘,用十字符号标记。我们可以观察到,这3条后缘表示图中存在3个循环。
对于断开连接的图,获取DFS林作为输出。若要检测循环,请通过检查后边缘来检查各个树中的循环。
要检测后缘,请跟踪DFS遍历函数递归堆栈中当前的顶点。如果到达递归堆栈中已经存在的顶点,则树中存在一个循环。将当前顶点连接到递归堆栈中顶点的边是后边。使用recStack[]数组跟踪递归堆栈中的顶点。
2 算法
- 使用给定数量的边和顶点创建图形。
- 创建一个递归函数,用于初始化当前索引或顶点、已访问和递归堆栈。
- 将当前节点标记为已访问,并在递归堆栈中标记索引。
- 查找所有未访问且与当前节点相邻的顶点。递归调用这些顶点的函数,如果递归函数返回true,则返回true。
- 如果相邻顶点已在递归堆栈中标记,则返回t