美文网首页
207.课程表!

207.课程表!

作者: HamletSunS | 来源:发表于2019-10-29 13:49 被阅读0次

本题是一道拓扑排序的问题,个人感觉难度还是挺大的,即便写出来也感觉有些似懂非懂。另外我个人认为本题并没有使用传统的拓扑排序,而是通过dfs来判断的图 有没有形成环路。

本题的技巧主要是

  1. 把二维数组转换成类似邻接表的图的表示方法
  2. 深度优先搜索dfs来判断从当前顶点出发有没有形成环路。这里需要借助flag数组来进行标记,flag有3种状态,-1表有环路,0是默认值代表还未处理,1代表无环路
  3. 遍历所有顶点,都没有形成环路,则返回true

代码:

class Solution {
public:
    bool canFinish(int numCourses, vector<vector<int>>& p) {
        if(p.size()==0)
            return true;
        int n=p.size();
        vector<int> flag(numCourses,0);
        vector<vector<int>> tmp(numCourses,vector<int>());
        for(int i=0;i<n;i++)
            tmp[p[i][0]].push_back(p[i][1]);
        
        bool ans=true;
        for(int i=0;i<numCourses;i++)
            ans=ans&&dfs(i,flag,tmp);
        return ans;
        
        
    }
    
    bool dfs(int i,vector<int> &flag,vector<vector<int>> &tmp){
        if(flag[i]==-1)
            return false;
        if(flag[i]==1)
            return true;
        
        flag[i]=-1;
        int n=tmp[i].size();
        for(int j=0;j<n;j++){
            if(dfs(tmp[i][j],flag,tmp))
                continue;
            else
                return false;
        }          
        
        flag[i]=1;
        return true;
    }
};

预计用时10分钟,实际用时48分钟

相关文章

网友评论

      本文标题:207.课程表!

      本文链接:https://www.haomeiwen.com/subject/lbnwvctx.html