目录
课程表
方法一:
先根据题目所给的条件建立有向图,如果学习x前必须先学习y,那么就画一条弧y->x,建图完成后再使用拓扑排序即可。
代码:
class Solution {
public:
vector<vector<int>> mp;
vector<int> du;
int n;
bool topSort() {
int cnt = 0;
stack<int> stk;
for(int i = 0; i < n; i++) {
if(du[i] == 0) {
stk.push(i);
}
}
while(!stk.empty()) {
int t = stk.top();
stk.pop();
cnt++;
for(int i = 0; i < n; i++) {
if(mp[t][i]) {
du[i]--;
if(du[i] == 0) {
stk.push(i);
}
}
}
}
return cnt == n;
}
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
mp = vector<vector<int>>(numCourses, vector<int>(numCourses));
du = vector<int>(numCourses);
n = numCourses;
for(int i = 0; i < prerequisites.size(); i++) {
mp[prerequisites[i][1]][prerequisites[i][0]] = 1;
du[prerequisites[i][0]]++;
}
return topSort();
}
};
方法二:
广度优先搜索:将方法一中的栈变为队列即可。
代码:
class Solution {
public:
vector<vector<int>> mp;
vector<int> du;
int n;
bool topSort() {
int cnt = 0;
queue<int> que;
for(int i = 0; i < n; i++) {
if(du[i] == 0) {
que.push(i);
}
}
while(!que.empty()) {
int t = que.front();
que.pop();
cnt++;
for(int i = 0; i < n; i++) {
if(mp[t][i]) {
du[i]--;
if(du[i] == 0) {
que.push(i);
}
}
}
}
return cnt == n;
}
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
mp = vector<vector<int>>(numCourses, vector<int>(numCourses));
du = vector<int>(numCourses);
n = numCourses;
for(int i = 0; i < prerequisites.size(); i++) {
mp[prerequisites[i][1]][prerequisites[i][0]] = 1;
du[prerequisites[i][0]]++;
}
return topSort();
}
};