LeetCode 207. 课程表

class Solution {
public:
    bool canFinish(int n, vector<vector<int>>& pre) {
        if(pre.empty()||pre[0].empty()) return true;
        vector<vector<bool>> g(n,vector<bool>(n,false));
        for(auto q:pre)
            g[q[0]][q[1]]=true;
        vector<int> st(n,false);
        //0表示未进入递归,1表示可以修读,2表示不能修读
        for(int i=0;i<n;i++)
        {
            if(!st[i]&&!dfs(i,st,n,g))
                return false;
            else if(st[i]==2)   return false;
        }
        return true;
    }
    bool dfs(int num,vector<int>& st,int n,vector<vector<bool>> &g)//尝试修第num门课
    {
        if(st[num]==2)  return false;
        if(st[num]==1)  return true;
        //如果进入过递归,直接返回答案
        st[num]=2;
        for(int i=0;i<n;i++)
            if(g[num][i])//遍历所有先修课程
            {
                if(i==num)//如果先修课程包含自己,直接返回false
                {
                    st[num]=2;
                    return false;
                }
                if(!dfs(i,st,n,g))
                    return false;
            }
        st[num]=1;
        return true;
    }
};
posted @   穿过雾的阴霾  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示