图(三色标记法,初概念)
//颜色染色法
class Solution {
public:
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
vector<vector<int>>g(numCourses);
for(auto&q:prerequisites){
g[q[0]].push_back(q[1]);
}
vector<int>color(numCourses,0);
//0表示未访问,1表示正在访问,2表示访问结束
auto dfs=[&](this auto&&dfs,int x)->bool{
color[x]=1;
for(auto&p:g[x]){
if(color[p]==1||color[p]==0&&dfs(p)){
return true;
}
}
color[x]=2;
return false;
};
for(int i=0;i<numCourses;i++){
if(dfs(i)) return false;
}
return true;
}
};
//拓扑排序(kahn算法)
class Solution {
public:
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
vector<vector<int>>e(numCourses);
vector<int>din(numCourses);//入度
for(auto&q:prerequisites){
e[q[1]].push_back(q[0]);//邻接表
din[q[0]]++;
}
queue<int>tp;
for(int i=0;i<numCourses;i++){
if(din[i]==0) tp.push(i);
}
int ans=0;
while(!tp.empty()){
int x=tp.front();
tp.pop();
ans++;
for(auto&q:e[x]){
if(--din[q]==0){
tp.push(q);
}
}
}
return ans==numCourses;
}
};