文章目录
- 1. 题目
- 2. 解题
1. 题目
总共有n个课程,从0到n-1。
有些课程可能有先决条件,例如,你想修课程0,你必须先修一门课程1,这两门课之间的关系表示为:[0,1]
给定课程的总数和先决条件对的列表,返回你可以得到所有课程的不同方法的数量。
n <= 10样例1
输入:
n = 2
prerequisites = [[1,0]]
输出: 1
说明:
你必须按照0->1的顺序上课。样例2
输入:
n = 2
prerequisites = []
Output: 2
输出:
你可以按0->1或1->0的顺序上课。
https://tianchi.aliyun.com/oj/286601234951741590/302577566233072416
2. 解题
- 建图,记录出入度
- n 比较小,dfs 搜索
class Solution {
public:/*** @param n: an integer, denote the number of courses* @param p: a list of prerequisite pairs* @return: return an integer,denote the number of topologicalsort*/int ans = 0;int topologicalSortNumber(int n, vector<vector<int>> &p) {// Write your code herevector<int> indegree(n, 0);vector<bool> vis(n, false);vector<vector<int>> g(n);for(auto& pi : p){indegree[pi[0]]++;g[pi[1]].push_back(pi[0]);}dfs(g, vis, indegree, 0);return ans;}void dfs(vector<vector<int>> &g, vector<bool>& vis, vector<int> &indegree, int count){if(count == g.size()){ans++;return;}for(int i = 0; i < g.size(); i++){if(vis[i]) continue;if(indegree[i]==0){vis[i] = true;for(auto nt : g[i])indegree[nt]--;dfs(g, vis, indegree, count+1);for(auto nt : g[i])indegree[nt]++;vis[i] = false;}}}
};
2490ms C++
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!