207. 课程表
方法一:拓扑排序
class Solution {
public:
vector<vector<int>> get_adj_list(int numCourses,vector<vector<int>> &prerequisites){
vector<vector<int>> graph(numCourses);
for(auto &e:prerequisites){
graph[e[0]].push_back(e[1]);
}
return graph;
}
bool topo_sort(vector<vector<int>> &graph){
int cnt=0;
int num_v=graph.size();
vector<int> deg(num_v);
stack<int> st;
for(int i=0;i<num_v;i++){
for(auto &v:graph[i]){
deg[v]++;
}
}
for(int i=0;i<deg.size();i++){
if(deg[i]==0){
st.push(i);
}
}
while(!st.empty()){
int v=st.top();
st.pop();
cnt++;
for(auto &i:graph[v]){
deg[i]--;
if(deg[i]==0){
st.push(i);
}
}
}
if(cnt<num_v){
return false;
}
else{
return true;
}
}
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
auto adj_list=get_adj_list(numCourses,prerequisites);
return topo_sort(adj_list);
}
};
方法二:dfs深搜
class Solution {
public:
vector<vector<int>> get_adj_list(int numCourses,vector<vector<int>> &prerequisites){
vector<vector<int>> graph(numCourses);
for(auto &e:prerequisites){
graph[e[0]].push_back(e[1]);
}
return graph;
}
void dfs(vector<vector<int>> &graph,int u,vector<int> &vis,vector<int> &in_dfs,bool &loop){
if(loop){
return ;
}
in_dfs[u]=1;
vis[u]=1;
for(auto &v:graph[u]){
if(in_dfs[v]){
loop=true;
return ;
}
if(!vis[v]){
dfs(graph,v,vis,in_dfs,loop);
}
}
in_dfs[u]=0;
}
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
auto graph=get_adj_list(numCourses,prerequisites);
vector<int> vis(numCourses);
vector<int> in_dfs(numCourses);
bool loop=false;
for(int i=0;i<numCourses;i++){
if(!vis[i]){
dfs(graph,i,vis,in_dfs,loop);
if(loop){
break;
}
}
}
return !loop;
}
};