2020-06-05
1.题目描述
课程表
2.题解
拓扑排序,首先我们需要一个入度矩阵和邻接表来存放相关的信息,将入度为0的点存入队列/栈,并且将
与其相连的点的入度减1,重复上述操作,如果此时学习完的课程数等于numCourses则返回true。
207
class Solution {
public:
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
vector<int> degree(numCourses,0); // 存放入度矩阵
vector<vector<int>> adjacent(numCourses); // 邻接表
// 初始化
for (int i=0;i<prerequisites.size();i++){
adjacent[prerequisites[i][1]].push_back(prerequisites[i][0]);
degree[prerequisites[i][0]]++;
}
queue<int> myque;
int cnt=0;
for (int i=0;i<numCourses;i++){
if (degree[i]==0){ // 入度为0
cnt++;
myque.push(i);
}
}
while (!myque.empty()){
int tmp=myque.front();
myque.pop();
for (int i=0;i<adjacent[tmp].size();i++){
degree[adjacent[tmp][i]]--;
if (degree[adjacent[tmp][i]]==0){
cnt++;
myque.push(adjacent[tmp][i]);
}
}
}
if (cnt==numCourses) return true;
return false;
}
};
210
class Solution {
public:
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
vector<int> degree(numCourses,0); // 存放入度矩阵
vector<vector<int>> adjacent(numCourses); // 邻接表
// 初始化
for (int i=0;i<prerequisites.size();i++){
adjacent[prerequisites[i][1]].push_back(prerequisites[i][0]);
degree[prerequisites[i][0]]++;
}
vector<int> res;
queue<int> myque;
int cnt=0;
for (int i=0;i<numCourses;i++){
if (degree[i]==0){ // 入度为0
cnt++;
myque.push(i);
res.push_back(i);
}
}
while (!myque.empty()){
int tmp=myque.front();
myque.pop();
for (int i=0;i<adjacent[tmp].size();i++){
degree[adjacent[tmp][i]]--;
if (degree[adjacent[tmp][i]]==0){
cnt++;
myque.push(adjacent[tmp][i]);
res.push_back(adjacent[tmp][i]);
}
}
}
if (cnt!=numCourses) res.clear();
return res;
}
};