Course Schedule 题解

题目

There are a total of n courses you have to take, labeled from 0 to n - 1.
Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pair: [0,1]
Given the total number of courses and a list of prerequisite pairs, is it possible for you to finish all courses?
For example:
2, [[1,0]]
There are a total of 2 courses to take. To take course 1 you should have finished course 0. So it is possible.

解析

这是一个典型的拓扑排序,判断是否存在环,如果0->1(学1前要学0),并且1->0,则输出false

public static boolean canFinish(int numCourses, int[][] prerequisites) {
        boolean canFinish = true;
        int[] indegree = new int[numCourses];//用来存放第i个结点的入度
        int[][] matrix = new int[numCourses][numCourses];//matrix[i][j],i->j,i是j的先行课

        Stack<Integer> stack = new Stack<Integer>();
        // 初始化邻接表
        for (int i = 0; i < prerequisites.length; i++) {
            if (matrix[prerequisites[i][1]][prerequisites[i][0]] == 1)
                continue;
            indegree[prerequisites[i][0]]++;
            matrix[prerequisites[i][1]][prerequisites[i][0]] = 1;
        }

        //将入度为0的结点入栈
        for(int i=0;i<numCourses;i++){
            if(indegree[i]==0)
                stack.push(i);
        }
        //将入度为0的结点出栈,且将以此节点为条件的结点的入度-1,并将此时为0的结点入栈,直到栈为空
        while(stack.size()>0){
            int node = stack.pop();
            for (int k = 0; k < numCourses; k++) {
                if (matrix[node][k] == 1) {
                    indegree[k]--;
                    matrix[node][k] = 0;
                    if(indegree[k]==0){
                        stack.push(k);
                    }
                }
            }
        }

        //统计是否含有入读大于0的结点
        for (int i = 0; i < numCourses; i++) {
            if (indegree[i] > 0) {
                canFinish = false;
                break;
            }
        }

        return canFinish;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值