判断图是否有环——附带Leetcode 课程表的Java解

本文介绍了如何判断图是否有环,通过拓扑排序的方法分别对无向图和有向图进行分析,并提供了DFS的判断策略。同时结合LeetCode的207和210课程表问题,阐述了将问题转化为图的环判断并给出Java解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

判断图是否有环

附带Leetcode 课程表的Java解

拓扑排序

无向图

  • 求出图中所有顶点的度
  • 把图中所有度 <=1 的顶点放入队列Q中
  • 依次抛出队列Q中的顶点,将抛出的顶点相关联的顶点的度减1,并判断关联顶点的度是否<=1,如果是,则也放入队列Q。
  • 直到Q中无任何顶点时,判断Q中抛出的点的数量是否等同于图中所有顶点的数量,如果等于,则无环;如果不等于,则有环。

Q中抛出的点的顺序即拓扑排序的顺序。

有向图

  • 求出图中所有顶点的度
  • 把图中所有入度 =0 的顶点放入队列Q中
  • 依次抛出队列Q中的顶点,将抛出的顶点出度(因此要维护一个出度的列表)的顶点的入度减1,并判断出度的顶点的入度是否=0,如果是,则也放入队列Q。
  • 直到Q中无任何顶点时,判断Q中抛出的点的数量是否等同于图中所有顶点的数量,如果等于,则无环;如果不等于,则有环。

Q中抛出的点的顺序即拓扑排序的顺序。

DFS

有向和无向区别不大,具体在于相邻节点处,有向图可能会构成环,但是无向图不会。

具体步骤如下:

深度优先遍历该图,如果在遍历的过程中,发现某个节点有一条边指向已经访问过的节点,并且这个已访问过的节点不是当前节点的父节点(这里的并且应该只是针对无向图),则表示存在环。

我们不能仅仅使用一个bool数组来标志节点是否访问过。

对每个节点分为三种状态,白、灰、黑。
开始时所有节点都是白色,当开始访问某个节点时该节点变为灰色,当该节点下面的所有节点都被访问完,返回到该节点时,该节点變成黑色。

那么我们的算法则为:如果遍历的过程中发现某个节点有一条边指向颜色为灰的节点,那么存在环。

Leetcode 207 课程表

将每个课程变成顶点就好多啦。这道题就变成了判断一个有向图是否有环了。

class Solution {
   
    public boolean canFinish(int numCourses, int[][] prerequisites) {
   
        Map<Integer, Node> map = new HashMap<>();
        for(int[] nums : prerequisites){
   
            if(!map.containsKey(nums[0])){
   
                map.put(nums[0], new Node(nums[0]));
            }
            if(!map.containsKey(nums[1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值