
链接:课程表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;
}
}