Leetcode 207

来源:互联网 发布:核聚变还有多少年知乎 编辑:程序博客网 时间:2024/06/15 20:34

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;    }};
原创粉丝点击