zoukankan      html  css  js  c++  java
  • 207. 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?

    Example 1:

    Input: 2, [[1,0]] 
    Output: true
    Explanation: There are a total of 2 courses to take. 
                 To take course 1 you should have finished course 0. So it is possible.

    Example 2:

    Input: 2, [[1,0],[0,1]]
    Output: false
    Explanation: There are a total of 2 courses to take. 
                 To take course 1 you should have finished course 0, and to take course 0 you should
                 also have finished course 1. So it is impossible.
    

    Note:

    1. The input prerequisites is a graph represented by a list of edges, not adjacency matrices. Read more about how a graph is represented.
    2. You may assume that there are no duplicate edges in the input prerequisites.

    这道题其实是判断graph是否有环。用到了topological sort + BFS。

    用二维数组graph表示图,一维数组indegree表示每个顶点的入度indegree, 还要用到一个queue,把所有indegree = 0的点放入队列中,然后开始遍历队列,从graph里遍历其连接的点,每到达一个新节点,其indegree减一,如果此时该点indegree = 0,放入队列。遍历完队列中所有的值,如果此时还有节点的indegree不为0,说明环存在,返回false,反之返回true。

    时间:O(VE),空间:O(V)

    class Solution {
        public boolean canFinish(int numCourses, int[][] prerequisites) {
            if(numCourses <= 0) return false;
            ArrayList[] graph = new ArrayList[numCourses];
            int[] indegree = new int[numCourses];
            
            for(int i = 0; i < numCourses; i++)
                graph[i] = new ArrayList();
            for(int[] pair : prerequisites) {
                graph[pair[1]].add(pair[0]);
                indegree[pair[0]]++;
            }
            
            Queue<Integer> q = new LinkedList<>();
            for(int i = 0; i < indegree.length; i++) {
                if(indegree[i] == 0)
                    q.offer(i);
            }
            
            while(!q.isEmpty()) {
                int cur = q.poll();
                ArrayList tmp = graph[cur];
                for(int i = 0; i < tmp.size(); i++) {
                    --indegree[(int)tmp.get(i)];
                    if(indegree[(int)tmp.get(i)] == 0)
                        q.offer((int)tmp.get(i));
                }
            }
            
            for (int i = 0; i < numCourses; ++i) {
                if (indegree[i] != 0)
                    return false;
            }
            return true;
        }
    }
  • 相关阅读:
    (最大团) poj 3692
    (floyd+匈牙利算法) poj 3216
    (floyd+匈牙利算法) poj 2594
    (最小点覆盖) hdu 1054
    (最小点覆盖) hdu 4619
    (最小点覆盖) hdu 1498
    (匈牙利算法+贪心) hdu 3729
    (匈牙利算法) hdu 5093
    (匈牙利算法) bzoj 1059
    (二分+匈牙利算法) hdu 2236
  • 原文地址:https://www.cnblogs.com/fatttcat/p/10021339.html
Copyright © 2011-2022 走看看