반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- m1 docker install
- 가운데 글자 가져오기 java
- 최단 경로 알고리즘
- 트리의 지름 자바
- 코드업 1020 java
- 나누어 떨어지는 숫자 배열 java
- 나누어 떨어지는 숫자 배열 python
- 최소 스패닝 트리
- docker 완전 삭제
- codeup 1020 자바
- m1 docker
- 빅분기실기
- 프로그래머스 가운데 글자 가져오기 자바
- 프로그래머스 가운데 글자 가져오기 python
- 트리의 지름 java
- 프로그래머스 가운데 글자 가져오기 파이썬
- 가운데 글자 가져오기 자바
- 빅데이터분석기사
- docker 삭제
- 핸즈온 머신러닝
- 청년 AI Big Data 아카데미 13기
- 청년 Ai Big Data 아카데미
- 프로그래머스 나누어 떨어지는 숫자 배열 자바
- docker remove
- 가운데 글자 가져오기 파이썬
- 가운데 글자 가져오기 python
- 최소 스패닝 트리 자바
- 코드업 1020 자바
- codeup 1020 java
- 프로그래머스 나누어 떨어지는 숫자 배열 파이썬
Archives
- Today
- Total
NineTwo meet you
[알고리즘] 깊이 우선 탐색 (depth-first search) : DFS 본문
반응형
DFS(depth-first search)란?
그래프 이론에서 많이 사용되는 탐색 알고리즘 중 하나다.
현재 정점에서 인접한 간선들을 하나씩 점검하다 아직 방문하지 않은 정점으로 향하는 간선이 있다면 그 간선을 무조건 따라가는 탐색 알고리즘이다.
이전까지 거쳐온 정점을 기억하기 위해서 재귀를 사용한다.
또한 그래프의 모든 정점이 간선을 통해 연결되어 있다는 보장이 없기 때문에 그래프의 전체 구조를 파악하기 위해서
DFS로 풀 수 있는 유명한 문제를 살펴보겠습니다.
위상 정렬(topological sort)
그래프의 순서를 정렬하기 위한 방법이다.
각 정점의 의존 관계를 간선으로 표현한 의존성 그래프(dependency graph)의 순서를 나타내기 위해 사용된다.
이 그래프의 가장 큰 특징은 사이클이 없다는 점이다.
따라서 의존성 그래프는 사이클이 없는 방향 그래프 DAG다.
위상 정렬을 구현하는 방법
배열, 리스트, 큐를 이용해 구현한다.
다음과 같은 변수를 지정한다.
int indegree[] | 들어오는 차수를 기록하는 배열 |
ArrayList<Integer>[] al | 그래프에 연결된 간선를 기록하는 배열 |
n개의 정점이 존재하고 v1 -> v2라는 방향 그래프에 대한 m개의 입력이 들어오면 다음과 같이 입력을 초기화한다.
for(int i = 0; i < n+1; i++) {
al[i] = new ArrayList<Integer>();
}
for(int i = 0; i < m; i++) {
st = new StringTokenizer(br.readLine());
int v1 = Integer.parseInt(st.nextToken());
int v2 = Integer.parseInt(st.nextToken());
al[v1].add(v2);
indegree[v2]++;
}
들어오는 차수가 0인 것을 큐에 넣고 해당 indegree의 값을 1씩 빼주면서 단계를 진행한다.
static void topologicalSort() {
Queue<Integer> q = new LinkedList<>();
for(int i = 1; i < indegree.length; i++) {
if(indegree[i] == 0) {
q.offer(i);
}
}
while(!q.isEmpty()){
int node = q.poll();
result.add(node);
for(Integer i : al[node]) {
indegree[i]--;
if(indegree[i] == 0) {
q.offer(i);
}
}
}
return;
}
반응형
'CS > 알고리즘' 카테고리의 다른 글
[알고리즘] 최소 스패닝 트리 : 프림 (Prim) (0) | 2021.01.24 |
---|---|
[알고리즘] 최소 스패닝 트리 : 크루스칼 (Kruskal) (0) | 2021.01.24 |
[알고리즘] 최단 경로 알고리즘 : 플로이드 와샬 (Floyd Warshall) (0) | 2021.01.20 |
[알고리즘] 최단 경로 알고리즘 : 벨만 포드 (Bellman-Ford) (0) | 2021.01.20 |
[알고리즘] 최단 경로 알고리즘 : 다익스트라 (Dijsktra) (0) | 2021.01.19 |
Comments