[拓扑排序] 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. Course Schedule(拓扑排序)