Пример #1
0
 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;
 }
Пример #2
0
 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;
 }
Пример #3
0
 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;
 }
Пример #4
0
 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;
 }