leetcode Course Schedule

本文讨论了如何使用深度优先搜索算法来检测课程依赖关系中的环路,确保课程可以按照正确顺序修读。

题目链接

思路:
根据给出的依赖关系构建一个图。然后在图里面用深度优先遍历判断是否有回路。如果依赖有回路,那么就是无法完成的。

深度优先判断回路:

如果一个课可以修到,那么着色为黑色实现如下:
因为深度优先遍历是递归的,所以我们在刚刚进去一个点A的时候着色为灰,代表这个点还有依赖(子孙B)。如果我们在遍历子孙B的时候,发现子孙依赖的节点是灰色的(不妨假设子孙B依赖A),那么代表产生环了,这是就是环路依赖。如果子孙依赖黑色点C,那么依赖点C可以修到,可以返回。
如果点A的所有子孙都不产生环路依赖,那么A也是可以修到的,着色黑。

public class Solution {
    private boolean  graph[][];
    private int record[];
    private final int  black=2;
    private final int  gray=1;
    private final int  write=0;
    private int coursesCount;

    private boolean DFS(boolean graph[][],int rowIndex)
    {
        if(record[rowIndex]==write)
        {
            record[rowIndex]=gray;
        }
        else if(record[rowIndex]==gray)
        {
            return false;
        }
        else
        {
            return true;
        }
        for(int i=0;i<coursesCount;i++)
        {
            if(graph[rowIndex][i])
            {
                if(DFS(graph,i))
                {
                    continue;
                }
                else
                {
                    return false;
                }
            }
        }

        record[rowIndex]=black;
        return true;
    }



    public boolean canFinish(int numCourses, int[][] prerequisites) {
        coursesCount=numCourses;
        graph=new boolean[numCourses][numCourses];
        record=new int[numCourses];
        for(int i=0;i<prerequisites.length;i++)
        {
            for(int j=prerequisites[i].length-1;j>0;j--)
            {
                graph[prerequisites[i][j]][prerequisites[i][j-1]]=true;
            }
        }


        for(int i=0;i<numCourses;i++)
        {
            for(int j=0;j<numCourses;j++)
            {
                if(graph[i][j])
                {
                    if(DFS(graph,i))
                    {
                        continue;  
                    }
                    else
                    {
                        return false;
                    }
                }
            }
        }


        return true;


    }

}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值