判断一个图是否有环

无向图

方法一:

如果存在回路,则必存在一个子图,是一个环路。环路中所有顶点的度>=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的推导,没有环。    在程序中加上一些特殊的处理,即可以找出图中有几个环,并记录每个环的路径

上一篇:积累各种好的链接


下一篇:飞天加速成长