bool dfs_circle(unordered_map<int, unordered_set<int>>& edges, vector<bool>& visited, vector<bool>& on_path, int i) { if (visited[i]) { return false; } visited[i] = on_path[i] = true; for (auto next: edges[i]) { if (on_path[next] || dfs_circle(edges, visited, on_path, next)) { return true; } } on_path[i] = false; return false; }
bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) { unordered_map<int, unordered_set<int>> edges; for (auto p: prerequisites) { edges[p.second].insert(p.first); } vector<bool> visited(numCourses, false), on_path(numCourses, false); for (int i = 0; i < numCourses; i++) { if (!visited[i] && dfs_circle(edges, visited, on_path, i)) { return false; } } return true; }
bool canFinish(int numCourses, vector<pair<int, int> >& prerequisites) { vector<vector<int> > graph(numCourses); vector<int> vis(numCourses); for (int i = 0; i < prerequisites.size(); i ++) { graph[prerequisites[i].first].push_back(prerequisites[i].second); //graph[prerequisites[i].first][prerequisites[i].second] = 1; } for (int i = 0; i < numCourses; i ++) { if (vis[i] == 0) { if (dfs_circle(graph, vis, i)) return false; } } return true; }
bool dfs_circle(vector<vector<int> >&graph, vector<int> &vis, int pos) { vis[pos] = 1; for (int i = 0; i < graph[pos].size(); i ++) { int cnt = graph[pos][i]; if (cnt != pos) { if (vis[cnt] == 1) return true; else if (vis[cnt] == 0) { if (dfs_circle(graph, vis, cnt)) return true; } } } vis[pos] = 2; return false; }