判断一个图是否有环

简介: 无向图方法一:如果存在回路,则必存在一个子图,是一个环路。环路中所有顶点的度>=2。    第一步:删除所有度v,必有v->u,则这是一个强连通子图。

无向图

方法一:

如果存在回路,则必存在一个子图,是一个环路。环路中所有顶点的度>=2。    

第一步:删除所有度<=1的顶点及相关的边,并将另外与这些边相关的其它顶点的度减一。  

第二步:将度数变为1的顶点排入队列,并从该队列中取出一个顶点重复步骤一。  

如果最后还有未删除顶点,则存在环,否则没有环。  

(实现代码以后补充)

方法二:

深度优先遍历该图,如果在遍历的过程中,发现某个节点有一条边指向已经访问过的节点,并且这个已访问过的节点不是当前节点的父节点(这里的父节点表示dfs遍历顺序中的父节点),则表示存在环。

(实现代码以后补充)



有向图

方法一:

拓扑排序,如果能够用拓扑排序完成对图中所有节点的排序的话,就说明这个图中没有环,而如果不能完成,则说明有环。

(实现代码以后补充)

方法二:

强连通子图:对于一个图的某个子图,该子图中的任意u->v,必有v->u,则这是一个强连通子图。

通过寻找图的强连通子图的方法可以找出一个图中到底有没有环、有几个环。

(实现代码以后补充)

方法三:

改进DFS

    图中的一个节点,根据其C[N]的值,有三种状态:

    0,此节点没有被访问过

    -1,被访问过至少1次,其后代节点正在被访问中

    1,其后代节点都被访问过。

    按照这样的假设,当按照DFS进行搜索时,碰到一个节点时有三种可能:

    1、如果C[V]=0,这是一个新的节点,不做处理

    2、如果C[V]=-1,说明是在访问该节点的后代的过程中访问到该节点本身,则图中有环。

    3、如果C[V]=1,类似于2的推导,没有环。    在程序中加上一些特殊的处理,即可以找出图中有几个环,并记录每个环的路径

相关文章
力扣203移除链表元素:思路分析+代码实现+方法总结(伪头节点法&递归)
力扣203移除链表元素:思路分析+代码实现+方法总结(伪头节点法&递归)
103 0
|
6月前
|
算法
判断单链表是否有环?中点如何判断?入环点如何判断?
判断单链表是否有环?中点如何判断?入环点如何判断?
|
6月前
|
算法 Java C++
数据结构与算法面试题:实现一个函数,判断一个链表是否为回文链表。(提示:反转后半部分链表比对前半部分)
数据结构与算法面试题:实现一个函数,判断一个链表是否为回文链表。(提示:反转后半部分链表比对前半部分)
36 0
|
存储 索引
判断环形链表是否有环??返回环形链表的入口点!!
判断环形链表是否有环??返回环形链表的入口点!!
42 1
|
6月前
快慢指针判断环形链表
快慢指针判断环形链表
|
索引
判断环形链表及寻找入环口问题详解
链表在面试和笔试中都是十分常见的问题。本篇文章会简述到判断环形链表和返回环形链表的入环点。其中有较多的细节,本篇文章会详细解释。
70 0
判断两个链表是否相交,相交的话返回相交的节点
1.判断是否相交 找到两个链表的最后一个节点,看是否相同,相同的话就相交,反之. 2.找两个链表长度的差值 为什么要找两个链表的差值呢? 为了判断哪个长,以便让长的链表先走差值,方便找相交处 3.找相交处 长的走后,再便利长的和短的一起走,以找到相交节点
40 0
|
存储 编译器
二叉树的递归遍历与迭代遍历(图示)
本文将讲述二叉树递归与迭代的相关知识。
130 0
判断链表是否存在环——快慢指针
判断链表是否存在环——快慢指针
108 0
判断链表是否存在环——快慢指针
|
存储 机器学习/深度学习 缓存
漫画算法:如何判断链表有环?
有一个单向链表,链表当中有可能出现“环”,就像下图这样。如何用程序判断出这个链表是有环链表?
110 0
漫画算法:如何判断链表有环?