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

写在前面

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

文章目录

  • 写在前面
  • 拓扑排序
  • 图是否成环
  • 相关资料

拓扑排序

[LeetCode] 局部图论问题探讨-图成环、图度、关键路径、拓扑排序等问题_第1张图片
拓扑排序的算法骨架是:
[LeetCode] 局部图论问题探讨-图成环、图度、关键路径、拓扑排序等问题_第2张图片

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

图是否成环

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

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

方法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
  • 慕课浙大计算机

你可能感兴趣的:(图)