815 · 课程表IV(dfs)

链接:课程表IV

题解:

cpp 复制代码
class Solution {
public:
    int topologicalSortNumber(int n, vector<vector<int>> &p) {
        const int MOD = 1e9 + 7;
        vector<vector<int>> graph(n);
        vector<int> indegree(n, 0);
        
        for (auto& e : p) {
            graph[e[1]].push_back(e[0]);   // e[1] -> e[0]
            ++indegree[e[0]];
        }
        
        vector<bool> visited(n, false);
        return dfs(0, n, indegree, graph, visited, MOD);
    }

private:
    int dfs(int step, int n, vector<int>& indegree,
            vector<vector<int>>& graph, vector<bool>& visited, int MOD) {
        if (step == n) {
            return 1;   // 所有课程都已安排
        }
        
        int count = 0;
        for (int i = 0; i < n; ++i) {
            // 只能选择未访问且入度为 0 的课程
            if (visited[i] || indegree[i] != 0) continue;
            
            visited[i] = true;
            for (int neigh : graph[i]) {
                --indegree[neigh];
            }
            
            count = (count + dfs(step + 1, n, indegree, graph, visited, MOD)) % MOD;
            
            // 回溯
            visited[i] = false;
            for (int neigh : graph[i]) {
                ++indegree[neigh];
            }
        }
        return count;
    }
};
cpp 复制代码
// 本题解信息来源于【九章算法】。请勿进行商业转载,非商业转载请注明出处。
public class Solution {
    /**
     * @param n: an integer, denote the number of courses
     * @param p: a list of prerequisite pairs
     * @return: return an long integer,denote the number of topologicalsort
     */
     
    boolean[][] pre = null;
    int[] preCnt = null;
    boolean[] selected = null;
    int res = 0;
    int n;
    
    void dfs(int level) {
        if (level == n) {
            ++res;
            return;
        }
        
        int i, j;
        for (i = 0; i < n; ++i) {
            if (!selected[i] && preCnt[i] == 0) {
                selected[i] = true;
                for (j = 0; j < n; ++j) {
                    if (pre[i][j]) {
                        --preCnt[j];
                    }
                }
                
                dfs(level + 1);
                
                for (j = 0; j < n; ++j) {
                    if (pre[i][j]) {
                        ++preCnt[j];
                    }
                }
                selected[i] = false;
            }
        }
    }
    
    public int topologicalSortNumber(int nn, int[][] p) {
        n = nn;
        int i, j;
        // pre[i][j] = true if and only if course i needs to be taken before course j
        pre = new boolean[n][n];
        preCnt = new int[n];
        selected = new boolean[n];
        
        for (i = 0; i < n; ++i) {
            preCnt[i] = 0;
            selected[i] = false;
            for (j = 0; j < n; ++j) {
                pre[i][j] = false;        
            }
        }
        
        for (i = 0; i < p.length; ++i) {
            pre[p[i][1]][p[i][0]] = true;
            ++preCnt[p[i][0]];
        }
        
        dfs(0);
        return res;
    }
}
相关推荐
罗西的思考21 小时前
【Agentic RL】Dressage Staleness 控制深度分析
人工智能·算法·机器学习
quaer21 小时前
弗洛伊德算法--判圈法寻找环的入口O(n) O(1)
数据结构·算法
高晶1 天前
无乘法器实现LC二阶滤波器:基于移位运算的快速算法与四种精度推导
算法·设计模式·程序员
ysbfsy1 天前
大数计算思路
算法
高晶1 天前
主从自动分配算法:平均值乘以设备数一半的选举基准值解析
算法·设计模式·程序员
学电子她就能回来吗1 天前
LeetCode Hot 100|普通数组专题学习笔记(零基础版)
笔记·算法·leetcode
用户老李1 天前
反向传播计算梯度举例
算法
niyongsheng1 天前
多智能体连续时间内路径规划:AA-SIPP(m) 的 Rust 实现与算法
算法·rust·机器人
302wanger1 天前
DeepSeek-V4.1-Flash-1017 免费用到1024,速来
算法
lisw051 天前
微分与积分的本质区别解析
算法·数学建模·极限编程