어떤 일을 하는 순서를 찾는 알고리즘이다.
DAG 란
1. 노드간의 순서가 있을때
2. 사이클이 없을때 -> 사이클 판단 가능
3. 시간복잡도 O(V+ E)
dfs , bfs 모두 가능하다. bfs로 구현해보도록 하겠다.
DAG는 노드간의 순서가 있기 때문에
진입차수가 0인것을 queue에 넣어서 BFS를 진행해 보도록 하겠다.
Dfs
for( n of All){
if(!visited[n]) dfs(n);
}
dfs(int now){
visited[now] = true;
for(next : adj){
if(!visited[next]) dfs(next);
}
stack.push(now); //dfs 나오는 순서대로 stack에 쌓아준다.
}
Bfs
static int bfs() { //위상정렬 DAG
Queue<Integer> q = new ArrayDeque<>();
int cnt = 0;
for(int i = 1 ;i <= indegree.size()-1 ; i ++){
if(indegree[i]==0){ // 인디그리가 없으면 큐에 넣어준다.
q.add(i);
}
}
while (!q.isEmpty()) {
int now = q.poll();
cnt++;
for (Node next : adj[now]) {
indegree[next.n]--; //next에 방문했으니 진입차수 줄여주기
// next에 오기까지 위한 최대 dist 구해주기 그래야 다음을 갈 수 있음
dist[next.n] = Math.max(dist[next.n], dist[now] + next.cost);
if (indegree[next.n] == 0) {
q.add(next.n);
}
}
}
return cnt != N // cnt가 N이 아니면 사이클이 있음
}
응용
1. 순서 찾기
2. 사이클 찾기
3. 문제 조건에 따라 순서 부여해 풀기
4. 위상정렬 + 동적 계획법
5. 사이클 없애가는 문제
'DEVELOP > ALGORITHM' 카테고리의 다른 글
Index Tree (인덱스 트리) (0) | 2021.03.08 |
---|---|
단절점 (Articulation Point) (0) | 2021.03.08 |
MST (최소신장트리) 크루스칼 알고리즘 (0) | 2021.03.08 |
Union Find (서로소 집합) (0) | 2021.03.08 |
Graph 최단거리 알고리즘(4) 트리 - LCA( Lowest Common Ancestor) 최소 공통 조상 (0) | 2021.03.08 |