zoukankan      html  css  js  c++  java
  • 【刷题-LeetCode】210. Course Schedule II

    1. Course Schedule II

    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, return the ordering of courses you should take to finish all courses.

    There may be multiple correct orders, you just need to return one of them. If it is impossible to finish all courses, return an empty array.

    Example 1:

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

    Example 2:

    Input: 4, [[1,0],[2,0],[3,1],[3,2]]
    Output: [0,1,2,3] or [0,2,1,3]
    Explanation: There are a total of 4 courses to take. To take course 3 you should have finished both     
                 courses 1 and 2. Both courses 1 and 2 should be taken after you finished course 0. 
                 So one correct course order is [0,1,2,3]. Another correct ordering is [0,2,1,3] .
    

    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.

    拓扑排序

    class Solution {
    public:
        vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
            vector<vector<int>>g(numCourses);
            vector<int>d(numCourses, 0);
            build_graph(numCourses, prerequisites, g, d);
            return topological_sort(numCourses, g, d);
        }
        vector<int> topological_sort(int numCourses, 
                              vector<vector<int>> &g, vector<int>&d){
            vector<int>ans;
            queue<int>q;
            for(int i = 0; i < d.size(); ++i)if(d[i] == 0)q.push(i);
            while(!q.empty()){
                int u = q.front();
                q.pop();
                ans.push_back(u);
                for(auto v : g[u]){
                    d[v]--;
                    if(d[v] == 0)q.push(v);
                }
            }
            return ans.size() == numCourses ? ans : vector<int>();
        }
        void build_graph(int numCourses, vector<vector<int>>& prerequisites,
                        vector<vector<int>>&g, vector<int>&d){
            for(auto x: prerequisites){
                g[x[1]].push_back(x[0]);
                d[x[0]]++;
            }
        }
    };
    
  • 相关阅读:
    make menuconfig显示错误“Your display is too small to run Menuconfig!”
    程序员的那点事(转自java老师李明志)
    不必太羡慕别人
    把数据存储到 XML 文件
    关于session
    网页中的服务器端和客户端脚本
    没有一种成功是不经历磨砺的
    考试导数据总结(一)
    我们应该爱上“犯错”——读应试教育的死穴,恰在于堵死了孩子“犯错”的空间
    软考——多媒体
  • 原文地址:https://www.cnblogs.com/vinnson/p/13322970.html
Copyright © 2011-2022 走看看