Leetcode 207 课程表(复习拓扑排序)
题目描述:
你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1]
给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习?
题解:
拓扑排序模板题目,简单复习了一下。看了一下之前用的模板,好丑...换个模板
AC代码:
class Solution { public: // 复习一下拓扑排序 bool Topo(int n) { queue<int> que; // 入度为0的点 for(int i=0;i<n;i++) { if(degree[i] == 0) que.push(i); } int count = 0; while(!que.empty()) { int now = que.front(); que.pop(); count++; int edge_len = edge[now].size(); for(int i=0;i<edge_len;i++) { degree[edge[now][i]]--; if(degree[edge[now][i]] == 0) que.push(edge[now][i]); } } // cout << count <<endl; if(count != n) return false; return true; } bool canFinish(int numCourses, vector<vector<int>>& prerequisites) { int Len = prerequisites.size(); for(int i=0;i<=numCourses;i++) { edge[i].clear(); degree[i] = 0; } for(int i=0;i<Len;i++) { int fir = prerequisites[i][0]; int sec = prerequisites[i][1]; degree[sec]++; edge[fir].push_back(sec); } return Topo(numCourses); } private: vector<int> edge[100010]; int degree[100010]; };