【题目描述】
你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 。
在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1]
给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/course-schedule
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
//Leetcode207:课程表
queue<int> que;
vector<int> indegree(numCourses,0);
vector<vector<int>> adj(numCourses,vector<int>());
//build adjacent list
for (int i = 0; i < prerequisites.size(); i++) {
int cur = prerequisites[i][1];
int adjN = prerequisites[i][0];
adj[cur].push_back(adjN);
//build indegree list
indegree[adjN]++;
}
//for (int i = 0; i < adj.size(); i++) {
// for (int j = 0; j < adj[i].size(); j++) {
// cout << "front: " << i << " back: " << adj[i][j] << endl;
// }
//}
//for (int i = 0; i < indegree.size(); i++) {
// cout << indegree[i] << " ";
//}
//cout << endl;
for (int i = 0; i < indegree.size(); i++) {
if (indegree[i] == 0) {
que.push(i);
}
}
while (!que.empty()) {
int cur = que.front();
que.pop();
//cout << "pop: " << cur << endl;
numCourses--;
indegree[cur] = -1;
for (int i = 0; i < adj[cur].size(); i++) {
indegree[adj[cur][i]]--;
if (indegree[adj[cur][i]] == 0) {
que.push(adj[cur][i]);
}
}
}
if (numCourses == 0) return true;
else return false;
}
网友评论