有向图、无向图是否有环的判断
今天在做数据库的调度冲突可串行性判别的程序,中间要用到有向图中环判定的问题,特摘录如下。这些算法和思想都是来自网上的,在此感谢原作者!
先介绍一下无向图的判断算法,这个比较简单:
判断无向图中是否存在回路(环)的算法描述
如果存在回路,则必存在一个子图,是一个环路。环路中所有顶点的度>=2。
算法:
第一步:删除所有度<=1的顶点及相关的边,并将另外与这些边相关的其它顶点的度减一。
第二步:将度数变为1的顶点排入队列,并从该队列中取出一个顶点重复步骤一。
如果最后还有未删除顶点,则存在环,否则没有环。
算法分析:
由于有m条边,n个顶点。如果m>=n,则根据图论知识可直接判断存在环路。
(证明:如果没有环路,则该图必然是k棵树 k>=1。根据树的性质,边的数目m = n-k。k>=1,所以:m<n)
如果m<n 则按照上面的算法每删除一个度为0的顶点操作一次(最多n次),或每删除一个度为1的顶点(同时删一条边)操作一次(最多m次)。这两种操作的总数不会超过m+n。由于m<n,所以算法复杂度为O(n)
接下来介绍有向图是否有环的判定算法,主要有深度优先和拓扑排序2中方法。
1、拓扑排序,如果能够用拓扑排序完成对图中所有节点的排序的话,就说明这个图中没有环,而如果不能完成,则说明有环。
2、可以用Strongly Connected Components来做,我们可以回忆一下强连通子图的概念,就是说对于一个图的某个子图,该子图中的任意u->v,必有v->u,则这是一个强连通子图。这个限定正好是环的概念。所以我想,通过寻找图的强连通子图的方法应该可以找出一个图中到底有没有环、有几个环。
3、就是用一个改进的DFS
刚看到这个问题的时候,我想单纯用DFS就可以解决问题了。但细想一下,是不能够的。如果题目给出的是一个无向图,那么OK,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的推导,没有环。 在程序中加上一些特殊的处理,即可以找出图中有几个环,并记录每个环的路径
上面这个算法我没看懂。。所以没实现,但是自己用DFS实现了环检测。
- // DFS,发现回路(返回true)则不可序列化,返回false
- for (int i = 1; i <= n; i++) {
- if (dfsCheckCircuit(i))
- return false;
- }
- // 如果发现回路则返回true,否则遍历结束返回false
- private boolean dfsCheckCircuit(int current) {
- if (walked[current]) {
- return true;
- }
- walked[current] = true;
- for (int i = 1; i <= n; i++)
- if (digraph[current][i]) {
- if (dfsCheckCircuit(i)) {
- return true;
- }
- }
- walked[current] = false;
- return false;
- }
有向图、无向图是否有环的判断相关推荐
- 判断图有无环_判断无向图/有向图中是否存在环
本文主要针对如何判断有向图/无向图中是否存在环的问题进行简单的论述. 一 无向图 1.利用DFS进行判断 利用DFS判断有向图是否存在环,是最为常用的一种方法,虽然这种方法很常用,但可参考的代码的实现 ...
- Python 判断无向图是否存在环
代码实现 def has_cycle(G):"""判断无向图是否有环:param G: example {0: [1,2],1: [3], 2: []}:return:T ...
- Leet Code题解 - 1559. Detect Cycles in 2D Grid 检测二维无向图中的环
Leet Code题解 -- 1559. Detect Cycles in 2D Grid 检测二维无向图中的环 前言 一.题目描述 二.思路整理 1. 审题 2. 分布实现步骤 2.1 将二维数组处 ...
- LeetCode 141.带环问题(判断是否带环) 142.带环问题(返回入环点)
目录: 1.带环问题(判断是否带环) (1)题目描述 (2)思路解析 a.问题: 怎么证明快指针和慢指针一定会在环里相遇,而不是一直错过? b.问题:如果slow一次走一步,fast一次走3步?fas ...
- python找图里的环_python判断无向图环是否存在的示例
暂时是一个手动设置无向图中的边,用一个二维数组表示,后面会改进为用户自己定义无向图的边. 学习python的新手,若大佬有解决的办法,希望不吝赐教 #无向图判断环是否存在 def dfs(u,fa): ...
- python中判断无向图是否有环_数据结构与算法:17 图
17 图 知识结构: 图1 知识结构 1. 图的基本概念与术语 1.1 图的定义 图由顶点集和边集组成,记为 . 顶点集:顶点的有穷非空集合,记为. 边集:顶点偶对的有穷集合,记为 . 边: 无向边: ...
- 无向图的完美消除序列 判断弦图 ZOJ 1015 Fish net
ZOJ1015 题意简述:给定一个无向图,判断是否存在一个长度大于3的环路,且其上没有弦(连接环上不同两点的边且不在环上). 命题等价于该图是否存在完美消除序列. 所谓完美消除序列:在 vi,v ...
- 用拓扑排序检测有向图中是否有环
目录 算法主要步骤 代码 测试数据 提示:由于拓扑排序的检测方式不涉及到边权或点权,所以拓扑序列中的正环和负环都能够被检测出来.检测可达负环可以用Bellman-Ford或者SPFA. 算法主要步骤 ...
- LeetCode Course Schedule(有向图中是否存在环)
问题:给出个课程个数,及前提条件对[u,v],即修课程v之间需要修课程u,问是否存在环 思路: 对于有向图的判断环 一种方式是使用dfs,访问结点的状态分为三种,white,gray,black,其中 ...
最新文章
- sharepoint webpart 样式修改
- Codrops 教程:基于 CSS3 的精美模态窗口效果
- saltstack 任务管理和集群(三)
- UWP 保存用户设置
- 181219每日一句
- Socket Tcp高密集信息广播转发强度测试
- 《软件设计师教程最新版(第三版》
- hack_lu_2018_heap_heaven
- 机器学习识别电子数字-制作字体文件
- win11如何设置空间音效 windows11设置空间音效的步骤方法
- POST请求下载文件
- java 项目骨架,maven项目中骨架
- 如何用Python + baidu-aip 实现人脸识别?
- html5教程 如何加背景图片
- mysql 的几种缓存,数据库缓存几种方式 -解道Jdon
- 计算机临床医学自动化哪个好,这五个专业待遇高,就业好,但是很难学,挂科风险大,选择要慎重...
- Java数组实现冒泡排序
- android中的动画全解析
- ES7 ES8 ES9 ES10 新特性总结思考
- 客服ai虚拟数字人技术方案及制作流程