[LeetCode] 局部图论问题探讨-图成环、图度、关键路径、拓扑排序等问题

写在前面

前面的笔记集分别探讨了图的遍历、图的最小路径和最小生成树问题,本笔记将着重探讨图中其他典型问题,比如图是否成环、图的度使用(无向图)、图的入度和出度使用(有向图)、图的关键路径和拓扑序问题,关键的LT题目和解法可见笔记A。此笔记作为笔记A提领知识的补充和总结。

拓扑排序

在这里插入图片描述
拓扑排序的算法骨架是:
在这里插入图片描述

在这里插入图片描述

图是否成环

图的问题如果复杂起来,一般需要借助图的度解题,如果是有向图则需要借助图的入度和出度解题。

无向图的判环有两个方法:

方法1:采用类似有向图的拓扑排序方法,
(1)求所有节点的度
(2)将度小于等于1的节点删除掉,并重复这步操作
(3)若图中仍存在未被删除的节点,则图成环,否则图不成环
这个方法只能判断图是否成环,即得到一个bool值,但是无法知道又哪几个节点组成的环。

方法2:采用dfs遍历图,遍历过程对节点着色(未遍历到的节点为白色,遍历到的节点为灰色,若这个节点关联的邻接点全部被访问,则将这个节点标记为黑色),遍历的过程中,若发现某个节点的一条边指向灰色节点,则说明成环,(因为我们在遍历的过程中记录了节点遍历路径,而判环出,我们找到了环的起点和终点,因此环的位置即可找出)

有向图的判环有两个方法:

方法1:求图的拓扑序,由此可以判断图是否为DAG图(directed acyclic graph),利用容器记录入度为0的节点加速查找,
(1)计算图中所有节点的入度,把入度为0的点加入容器(比如栈)
(2)如果栈非空,则从栈中取元素,输出节点,并删除节点(在将这个节点的邻接点入度减一时若发现入度为0的节点,则将这个节点放入容器),重复(2)
(3)如果图中还存在顶点,则图成环,否则图为DAG图

方法2:利用无向图中DFS+着色遍历图,即可输出环。

同时对方法2在稍加理解,也可以用方法2求拓扑排序,入度的本质涵义是什么?是它对某个节点的依赖,而入度越大,依赖越重,那么在方法2中,着色时,访问到节点为黑色,代表它邻接点均被访问,那么此时就可以输出它了,遍历完图后,输出序列即为拓扑序。

相关资料

  • https://www.cnblogs.com/TenosDoIt/p/3644225.html
  • https://blog.csdn.net/leonsc/article/details/5973209
  • 慕课浙大计算机
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值