题目描述
出处 https://leetcode.com/problems/course-schedule/description/
There are a total of n courses you have to take, labeled from 0 to n-1.
Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pair: [0,1]
Given the total number of courses and a list of prerequisite pairs, is it possible for you to finish all courses?
Example 1:
Input: 2, [[1,0]]
Output: true
Explanation: There are a total of 2 courses to take. To take course 1 you shouldhave finished course 0. So it is possible.
Example 2:
Input: 2, [[1,0],[0,1]]
Output: false
Explanation: There are a totalof 2 courses to take. To take course 1 you should have finished course 0, and to take course 0 you should also have finished course 1. So it is impossible.
分析
这道题的目的是求有向图中是否又环,可以通过bfs的方法。记录可以完成的课程,若课程入度为零,则表示该课程可以进行。从入度为零的点开始,将该节点的子节点入度减一,记录所有入度为零节点数量,若图中不存在环,则入度为零节点数等于节点总数。
最终结果
class Solution {
public:
bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
vector<vector<int>> list(numCourses);
vector<int> degree(numCourses, 0);
queue<int> que;
for (auto p: prerequisites) {
list[p.second].push_back(p.first);
degree[p.first]++;
}
for (int i = 0; i < numCourses; i++) {
if (degree[i] == 0) {
que.push(i);
}
}
int finish = 0;
while(!que.empty()){
int num = que.front();
finish ++;
que.pop();
for(auto& p:list[num]) {
degree[p] --;
if (degree[p] == 0)
que.push(p);
}
}
return finish == numCourses;
}
};