LC.207.课程表(拓扑排序)

思路:拓扑排序。

1. d f s dfs dfs解法:

class Solution {
public:
vector<vector<int> >e;
vector<int>vis;//(0:未搜的点 1:正在搜的点 2:已经搜完的点)
bool ok;
void dfs(int u){
vis[u]=1;
for(int v:e[u]){
if(!vis[v]){
dfs(v);
if(!ok) return;
}
else if(vis[v]==1){
ok=0;
return;
}
}
vis[u]=2;
}
bool canFinish(int num, vector<vector<int>>& p) {
vis.resize(num),e.resize(num);
for(auto i:p){
int x=i[0],y=i[1];
e[y].push_back(x);
}
ok=1;
for(int i=0;i<num&&ok;i++) if(!vis[i]) dfs(i);
return ok;
}
};

b f s bfs bfs解法:

class Solution {
public:
int d[100005];
vector<int>e[100005];
bool bfs(int num, vector<vector<int>>& p){
int cnt=0;
queue<int>q;
for(int i=0;i<num;i++) if(!d[i]) q.push(i);
while(!q.empty()){
int u=q.front();q.pop();
cnt++;
for(int v:e[u]){
if(--d[v]==0) q.push(v);
}
}
return cnt==num;
}
bool canFinish(int num, vector<vector<int>>& p) {
for(auto i:p){
int x=i[0],y=i[1];
e[y].push_back(x);
d[x]++;
}
return bfs(num,p);
}
};