https://leetcode.com/problems/course-schedule/description/
* 풀이
- 선행조건을 방향 그래프로 바꿔서 표현
- 뒤의원소의 인접리스트에 앞의 원소 추가
- vis의 상태를 구분해야함
- 1: 방문중
- 2: 방문완료
vector<int> adj[2004];
int vis[2004]; // 1: 방문중, 2: 방문완료
class Solution {
public:
int dfs(int cur){
if(vis[cur]==1) return 0; // 사이클!
if(vis[cur]==2) return 1;
vis[cur]=1;
for(auto nxt : adj[cur]){
int res = dfs(nxt);
if(res==0) return 0;
}
vis[cur]=2; // 탐색완료 표시
return 1;
}
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
for(int i=0;i<2004;++i) adj[i].clear();
memset(vis,0,sizeof(vis));
for(auto prerequisite : prerequisites){
int a = prerequisite[0];
int b = prerequisite[1];
// cout<<a<<" "<<b;
adj[b].push_back(a);
}
for(int i=0;i<numCourses;++i){
if(vis[i]) continue;
if(dfs(i)==0){
return 0;
}
}
return 1;
}
};
'Algorithm > 그래프' 카테고리의 다른 글
[알고리즘] 백준 13244 Tree // tree의 조건 암기 (0) | 2025.01.18 |
---|---|
리트코드 133 그래프 클론 c++ // 그래프 복사하는방법 (0) | 2024.05.20 |
프로그래머스 도넛과막대그래프 c++ // 그래프 차수 특징발견, 사이클검사방법, 최대번호노드 찾는방법 (0) | 2024.05.07 |
백준 1717 집합의표현 c++ // 유니온 파인드 구현방법 (0) | 2023.11.29 |