zoukankan      html  css  js  c++  java
  • LeetCode-207 Course Schedule

    题目描述

    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

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

    E2

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

    解题思路

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

    复杂度分析

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

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

    代码

    class Solution {
    public:
        bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
            vector<unordered_set<int> > map(numCourses);
            for(int i = 0; i < prerequisites.size(); ++i) {
                map[prerequisites[i][1]].insert(prerequisites[i][0]);
            }
            //保存外围循环中该结点是否在DFS中被访问过
            vector<bool> f(numCourses, false);
            //保存每轮的dfs结点访问情况
            unordered_set<int> v;
            //进行外围的初始结点遍历,对每个尚未被访问的结点调用DFS
            for(int i = 0; i < numCourses; ++i) {
                if(!f[i])
                    if(dfs(map, f, v, i))
                        return false;
            }
            
            return true;
        }
        
        bool dfs(vector<unordered_set<int> >& pre, vector<bool>& f, unordered_set<int>& v, int k) {
            f[k] = true;
            v.insert(k);
            //依次访问与该结点相连接的结点,并递归调用DFS进行环判断
            for(unordered_set<int>::iterator iter = pre[k].begin(); iter != pre[k].end(); ++iter) {
                //若相连的结点中出现了在本次dfs中的结点,则表明该图存在环
                if(v.find(*iter) != v.end() || dfs(pre, f, v, *iter))
                    return true;
            }
            v.erase(k);
            
            return false;
        }
    };
  • 相关阅读:
    01背包
    用动态规划求两个自然数的最大公约数
    编程实现文件的复制功能,要求源文件名及目标文件名在程序运行后根据提示输入
    this和super
    JAVA中static的使用
    结构化异常处理 笔记
    继承和多态 笔记
    javascript 客户端验证和页面特效制作 学习笔记
    定义封装的类类型 笔记
    C# 核心编程结构Ⅱ 笔记
  • 原文地址:https://www.cnblogs.com/heyn1/p/11010729.html
Copyright © 2011-2022 走看看