enum class Color{white, gray, black};
struct State
{
State() = default;
int pre_count{};
Color color{Color::white};
};
class Solution {
public:
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
std::vector<std::vector<int>> adj_map(numCourses);
std::vector<State> c_state(numCourses);
for (const auto& ls : prerequisites)
{
adj_map[ls[1]].emplace_back(ls[0]);
c_state[ls[0]].pre_count += 1;
}
for (int i = 0; i < numCourses; ++i)
{
if (c_state[i].pre_count == 0 && c_state[i].color == Color::white)
{
dfs_visit(adj_map, c_state, i);
}
}
if(m_order.size() == numCourses)
return true;
return false;
}
private:
std::vector<int> m_order;
void dfs_visit(const std::vector<std::vector<int>>& adj_map, std::vector<State>& c_state, int course)
{
if (c_state[course].pre_count > 0)
return;
c_state[course].color = Color::gray;
m_order.emplace_back(course);
for (int next_course : adj_map[course])
{
c_state[next_course].pre_count -= 1;
if (c_state[next_course].pre_count == 0)
{
dfs_visit(adj_map, c_state, next_course);
}
}
c_state[course].color = Color::black;
}
};