[拓扑排序] leetcode 1136 Parallel Courses

Posted fish1996

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[拓扑排序] leetcode 1136 Parallel Courses相关的知识,希望对你有一定的参考价值。

 problem:https://leetcode.com/contest/biweekly-contest-5/problems/parallel-courses/

         这道题是leetcode双周赛的一道hard题,实际上难度并没有那么高。题目是给定课程的预修关系,比如要学习课程B,必须先学过课程A,输出学完所有课程的最短学期数。

         拓扑排序的基本思想:

         (1) 对于有向图,记录所有顶点的入度(指向该顶点的边的个数)

         (2) 找到所有入度为0的顶点,把顶点放入队列

         (3) 从队列pop出一个元素,该顶点则是当前满足条件的顶点,可将计数加一,并把它指向的顶点的入度都减一,重复(2)(3)直到队列为空

         如果已经找不到入度为0的顶点,而当前计数还没有覆盖到所有顶点,那么说明有向图中可能出现了环路。

class Solution 
public:
    vector<unordered_set<int>> g;
    int minimumSemesters(int N, vector<vector<int>>& r) 
        vector<int> indegree(N + 1, 0);
        g.resize(N + 1);
        for(int i = 0;i < r.size();i++)
        
            g[r[i][0]].insert(r[i][1]);
            indegree[r[i][1]]++;
        
        queue<int> q;
        for(int i = 1;i <= N;i++)
        
            if(indegree[i] == 0)
            
                q.push(i);
            
        

        int res = 0;
        int count = 0;
        while(!q.empty())
        
            int size = q.size();
            for(int i = 0;i < size;i++)
            
                int cur = q.front();
                q.pop();
                count++;
                        
                for(auto& next : g[cur])
                
                    indegree[next]--;
                    if(indegree[next] == 0)
                    
                        q.push(next);
                    
                   
            
            res++;
        
        if(count != N) return -1;

        return res;
    
;

 

以上是关于[拓扑排序] leetcode 1136 Parallel Courses的主要内容,如果未能解决你的问题,请参考以下文章

leetcode 207. 课程表---拓扑排序篇一

LeetCode拓扑排序

leetcode之拓扑排序刷题总结1

LeetCode 207. Course Schedule(拓扑排序)

LeetCode 207. Course Schedule(拓扑排序)

leetcode 210. 课程表 II----拓扑排序篇二