LeetCode-207 Course Schedule

Myth丶恋晨 2021-11-16 23:48 361阅读 0赞

题目描述

There are a total of n courses you have to take, labeled from 0 to n-1.

Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pair: [0,1]

Given the total number of courses and a list of prerequisite pairs, is it possible for you to finish all courses?

题目大意

判断一个有向图是否存在环。

示例

E1

  1. Input: 2, [[1,0]]
  2. Output: true

E2

  1. Input: 2, [[1,0],[0,1]]
  2. Output: false

解题思路

DFS搜索每个结点相连接的结点,用visited数组保存在本轮dfs过程中是否访问过本结点,若访问过则表示出现环。

复杂度分析

时间复杂度:O(|V| + |E|)

空间复杂度:O(|E|)

代码

  1. class Solution {
  2. public:
  3. bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
  4. vector<unordered_set<int> > map(numCourses);
  5. for(int i = 0; i < prerequisites.size(); ++i) {
  6. map[prerequisites[i][1]].insert(prerequisites[i][0]);
  7. }
  8. //保存外围循环中该结点是否在DFS中被访问过
  9. vector<bool> f(numCourses, false);
  10. //保存每轮的dfs结点访问情况
  11. unordered_set<int> v;
  12. //进行外围的初始结点遍历,对每个尚未被访问的结点调用DFS
  13. for(int i = 0; i < numCourses; ++i) {
  14. if(!f[i])
  15. if(dfs(map, f, v, i))
  16. return false;
  17. }
  18. return true;
  19. }
  20. bool dfs(vector<unordered_set<int> >& pre, vector<bool>& f, unordered_set<int>& v, int k) {
  21. f[k] = true;
  22. v.insert(k);
  23. //依次访问与该结点相连接的结点,并递归调用DFS进行环判断
  24. for(unordered_set<int>::iterator iter = pre[k].begin(); iter != pre[k].end(); ++iter) {
  25. //若相连的结点中出现了在本次dfs中的结点,则表明该图存在环
  26. if(v.find(*iter) != v.end() || dfs(pre, f, v, *iter))
  27. return true;
  28. }
  29. v.erase(k);
  30. return false;
  31. }
  32. };

转载于:https://www.cnblogs.com/heyn1/p/11010729.html

发表评论

表情:
评论列表 (有 0 条评论,361人围观)

还没有评论,来说两句吧...

相关阅读