BFS
- 思路
- 找这个图有没有环
- BFS遍历的过程是:不断将入读为0的点加入到队列中,
- 如果没有环的话,那么最终入队的点的总个数应该等于图上的所有结点数
class Solution {
public:
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
vector<vector<int>> neighbour(numCourses);
vector<int> degree(numCourses, 0);
int count = 0;
queue<int> q;
for(auto& i: prerequisites){
degree[i[0]]++;
neighbour[i[1]].push_back(i[0]);
}
for(int i=0;i<numCourses; i++)
if(degree[i]==0){
count++;
q.push(i);
}
while(!q.empty()){
int cur = q.front();
q.pop();
for(int i: neighbour[cur]){
degree[i]--;
if(degree[i]==0){
q.push(i);
count++;
}
}
}
if(count==numCourses) return true;
return false;
}
};
DFS
- 状态量为三个:0:unknown 1:visiting 2:visited
- 当一次dfs搜索过程中碰到了visiting,说明有环,那么就返回false
class Solution {
public:
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
graph_ = vector<vector<int>>(numCourses);
for( auto& p: prerequisites){
graph_[p[1]].push_back(p[0]);
}
// 0:unknown 1:visiting 2:visited
vector<int> v(numCourses, 0);
for(int i=0; i<numCourses; i++)
if(!dfs(i, v)) return false;
return true;
}
private:
vector<vector<int>> graph_;
bool dfs(int cur, vector<int>& v){
if(v[cur] == 1) return false;
if(v[cur] == 2) return true;
v[cur] = 1;
for(int i: graph_[cur])
if(!dfs(i, v)) return false;
v[cur] = 2;
return true;
}
};
参考-lq discuss