原题题目
代码实现(首刷自解)
class Solution {
public:
bool dfs(int pos,vector<int>& visit,vector<unordered_set<int>>& m)
{
if(visit[pos] == 2) return false;
if(visit[pos] == 1) return true;
visit[pos] = 1;
for(const auto& c:m[pos])
{
if(visit[c]!=2)
if(dfs(c,visit,m)) return true;
}
visit[pos] = 2;
return false;
}
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
vector<unordered_set<int>> m(numCourses);
for(const auto& c:prerequisites)
m[c[0]].emplace(c[1]);
vector<int> visit(numCourses);
for(int i=0;i<numCourses;++i)
{
if(m[i].size() && visit[i] != 2)
if(dfs(i,visit,m)) return false;
}
return true;
}
};
代码实现(二刷自解 DAY 154 C++)
class Solution {
public:
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
int learned_courses = 0;
vector<int> ready,next;
unordered_map<int,int> indegree;
for(int i=0;i<numCourses;++i) indegree[i] = 0;
unordered_map<int,vector<int>> outdegree;
for(const auto& pair:prerequisites)
{
outdegree[pair[1]].emplace_back(pair[0]);
indegree[pair[0]]++;
}
for(const auto& node:indegree)
if(!node.second) ready.emplace_back(node.first);
while(!ready.empty())
{
next.clear();
for(const auto& num:ready)
{
++learned_courses;
for(const auto& index:outdegree[num])
{
--indegree[index];
if(!indegree[index]) next.emplace_back(index);
}
}
ready = next;
}
return learned_courses == numCourses;
}
};
代码实现(三刷自解 DAY 13 golang)
func canFinish(numCourses int, prerequisites [][]int) bool {
outdegree := make(map[int]map[int]struct{})
indegree := make(map[int]int)
var nowturn []int
for i := 0; i < numCourses; i++ {
outdegree[i] = make(map[int]struct{})
}
for _, coursepair := range prerequisites {
outdegree[coursepair[1]][coursepair[0]] = struct{}{}
indegree[coursepair[0]]++
}
for i := 0; i < numCourses; i++ {
if indegree[i] == 0 {
nowturn = append(nowturn, i)
}
}
outnums := 0
for len(nowturn) != 0 {
nowsize := len(nowturn)
for _, course := range nowturn {
for outcourse, _ := range outdegree[course] {
indegree[outcourse]--
if indegree[outcourse] == 0 {
nowturn = append(nowturn, outcourse)
}
}
}
nowturn = nowturn[nowsize:]
outnums += nowsize
}
return outnums == numCourses
}