Leetcode 207, Couese schedule, 难度medium
这道题可以用DFS用拓扑的思想来解决,跟普通的dfs不一样,不仅需要记录已经访问过的节点,还需要记录当前正在访问的节点,因为拓扑就是判断是否是有向无环图,所以在从某一个节点开始进行深搜的时候,它的邻居结点如果又访问到了原来的节点那就是有环,当这个有向无环图可以分成两个强连通部件的时候,从一个强连通部件指向另一个已经访问过的强连通部件的时候,因为另一个强连通部件中的Course不在当前的DFS中,所以虽然是访问了已经访问的节点,但是不属于有环。
以下是代码:
class Solution {
public:
bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
vector<unordered_set<int>> matrix(numCourses);
for(auto i: prerequisites) {
matrix[i.second].insert(i.first);
}
vector<bool> visited(numCourses, false), flag(numCourses, false);
for(int i = 0; i < matrix.size(); i++)
if(!flag[i] && dfs(matrix, visited, flag, i)) return false;
return true;
}
bool dfs( vector<unordered_set<int>> &matrix, vector<bool>& visited, vector<bool>& flag, int i) {
if(flag[i]) return false;
visited[i] = flag[i] = true;
for(auto it = matrix[i].begin(); it != matrix[i].end(); it++) {
if(visited[*it] || dfs(matrix, visited, flag, *it)) return true;
}
visited[i] = false;
return false;
}
};