c语言,有向图里如何检测是不是有环?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言,有向图里如何检测是不是有环?相关的知识,希望对你有一定的参考价值。
1、为其定义一个名称,就叫【StackEmpty】。
2、接下来在参数中传递一个Top表过来。
3、好了后就可以定义他的返回类型,空表时返回1,非空返回0,因此为整形。
6、然后就能写上这样的一段判断语句。
6、为了遵循一个出口,不建议程序中有两个return语句,建议定义一个变量。
6、然后返回这变量,这样就能更好的提高程序的可读性。运行就可以了。
参考技术A 有向图是否有环的判定算法,主要有深度优先和拓扑排序2中方法。1、拓扑排序,如果能够用拓扑排序完成对图中所有节点的排序的话,就说明这个图中没有环,而如果不能完成,则说明有环。
2、Strongly Connected Components。我们可以回忆一下强连通子图的概念,就是说对于一个图的某个子图,该子图中的任意u->v,必有v->u,则这是一个强连通子图。这个限定正好是环的概念。所以我想,通过寻找图的强连通子图的方法应该可以找出一个图中到底有没有环、有几个环。
3、改进的DFS
单纯用DFS是不能够的。如果题目给出的是一个无向图,DFS是可以解决的。但无向图得不出正确结果的。比如:A->B,A->C->B,我们用DFS来处理这个图,我们会得出它有环,但其实没有。
我们可以对DFS稍加变化,来解决这个问题。解决的方法如下:
图中的一个节点,根据其C[N]的值,有三种状态:
0,此节点没有被访问过
-1,被访问过至少1次,其后代节点正在被访问中
1,其后代节点都被访问过。
按照这样的假设,当按照DFS进行搜索时,碰到一个节点时有三种可能:
1、如果C[V]=0,这是一个新的节点,不做处理
2、如果C[V]=-1,说明是在访问该节点的后代的过程中访问到该节点本身,则图中有环。
3、如果C[V]=1,类似于2的推导,没有环。 在程序中加上一些特殊的处理,即可以找出图中有几个环,并记录每个环的路径.追问
谢谢你的回答,请问有具体实现吗?
追答好,等会发给你。
追问非常感谢~~~
追答不客气~~~
本回答被提问者采纳判断无向图和有向图是不是有环
参考技术A 方法1(数学方法) : 图的顶点数为n,边数为m,若n>=m+1,则无环;否则有环。
方法2 :使用并查集进行判断。
方法3 :DFS。使用visited数组辅助判断是否访问过。
方法1 :拓扑排序。每次取出入度为0为节点,并删除对应的边,如果最后还有节点则有环。
方法2 :DFS。使用一个color数组表示节点类型,color[i]=0表示该节点未被访问,color[i]=1表示该节点正在当前访问的路径中或该节点存在于环路中,color[i]=2表示该节点是安全不存在于环中的。
参加leetcode 802: https://leetcode-cn.com/problems/find-eventual-safe-states/
以上是关于c语言,有向图里如何检测是不是有环?的主要内容,如果未能解决你的问题,请参考以下文章