207. 课程表
题目
拓扑排序典型题。采用逐步删除入度为0点的方法。
class Solution {
public:
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
vector<vector<int>> d(numCourses);
int n=prerequisites.size();
vector<int> in_degree(numCourses,0);
for(int i=0;i<n;i++){
int u=prerequisites[i][0],v=prerequisites[i][1];
d[v].push_back(u);
in_degree[u]++;
}
queue<int> qn;
for(int i=0;i<numCourses;i++){
if(in_degree[i]==0){
qn.push(i);
}
}
int sum=0;
while(!qn.empty()){
sum++;
int k=qn.front();qn.pop();
int k_size=d[k].size();
for(int i=0;i<k_size;i++){
in_degree[d[k][i]]--;
if(in_degree[d[k][i]]==0){
qn.push(d[k][i]);
}
}
}
if(sum==numCourses) return true;
return false;
}
};
如果还需要知道具体路径(210. 课程表 II),记录即可。
class Solution {
public:
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
vector<vector<int>> d(numCourses);
int n=prerequisites.size();
vector<int> in_degree(numCourses,0);
for(int i=0;i<n;i++){
int u=prerequisites[i][0],v=prerequisites[i][1];
d[v].push_back(u);
in_degree[u]++;
}
queue<int> qn;
vector<int> res;
for(int i=0;i<numCourses;i++){
if(in_degree[i]==0){
qn.push(i);
}
}
int sum=0;
while(!qn.empty()){
sum++;
int k=qn.front();qn.pop();
res.push_back(k);//在这一步记录即可
int k_size=d[k].size();
for(int i=0;i<k_size;i++){
in_degree[d[k][i]]--;
if(in_degree[d[k][i]]==0){
qn.push(d[k][i]);
}
}
}
if(sum==numCourses) return res;
res.clear();
return res;
}
};