码迷,mamicode.com
首页 > 编程语言 > 详细

[拓扑排序] leetcode 1136 Parallel Courses

时间:2019-07-28 21:29:53      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:--   难度   http   color   return   ++   i++   problem   int   

 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

标签:--   难度   http   color   return   ++   i++   problem   int   

原文地址:https://www.cnblogs.com/fish1996/p/11260936.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!