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;
    }
}
相关推荐
lisw053 小时前
Dayhoff的PAM替换矩阵理论评介!
线性代数·算法·矩阵
一起学安全技术3 小时前
拆大模型 03|注意力的一句话版本:不用论文讲清 Attention
深度学习·算法·语言模型·transformer
Delightrs4 小时前
Rust LeetCode238 算法题解
开发语言·算法·rust
自信150413057595 小时前
重生之从0开始学习c++之——vector-中篇
c++·学习·算法
GoAI16 小时前
DeepSeek Harness Memory (一)主流记忆插件总结
后端·算法·面试
Pniubi17 小时前
力扣54.螺旋矩阵
算法·leetcode·矩阵
choumou_M19 小时前
算法_1:由浅入深学习快速排序QuickSort
学习·算法·排序算法
Coder_Shenshen20 小时前
罗克韦尔ACD工程归档离线变量树解析
算法·c#
心仪久了会沦陷21 小时前
C语言数据结构入门——树与二叉树详解:概念、堆实现与链式遍历
c语言·数据结构·算法