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 |
Tags
- 객체 지향 설계
- 이진탐색
- 분할정복
- 스프링
- 알고리즘
- Solid
- Algorithm
- 깊이 우선 탐색
- 확률분포함수
- Random variable
- 표본 추출
- Probability Distribution Function
- 확률분포
- 베이지안
- 너비 우선 탐색
- dfs
- 확률
- PostgreSQL
- 이분탐색
- 다형성
- spring boot
- 인터페이스
- dag
- 오일러 경로
- 기술 통계
- 재설치
- divide and conquer
- 확률변수
- 추론 통계
- BFS
Archives
- Today
- Total
말하는 감자
[Graph] DFS의 대표 예시 오일러 경로 본문
728x90
들어가기 전
한붓그리기로도 알려진 문제 오일러 서킷은 그래프 이론에서 첫 번째로 연구된 문제로 유명하다. 오일러 서킷은 주어진 도형의 모든 선을 정확히 한 번씩 그리고 시작점으로 돌아오는 문제이다. 결론부터 말하자면, 간선들이 하나의 컴포넌트에 포함되어 있고(부분 그래프가 없고) 모든 정점의 차수가 짝수라면 오일러 서킷은 항상 존재한다.
오일러 서킷을 찾아내는 알고리즘
# 슈도 코드
# 인접 행렬
adj = [[], ... ,[]]
answer = []
dfs(here):
answer.append(here)
for there in adj[here]:
while(adj[here][there] > 0):
# 방문할 간선을 지운다
adj[here][there] -= 1
# 무향 그래프라면
# adj[there][here] -= 1
dfs(there)
# 방향 그래프이기 때문에
answer.reverse()
시간복잡도
각 간선을 따라갈 때마다 dfs()를 호출하기 때문에 O(|E|)의 시간 복잡도를 가지고, 그 내부에서 다음 간선을 탐색할때 O(|V|)만큼의 시간 복잡도를 가지기 때문에 총 O(|E|*|V|)의 시간 복잡도를 가진다.
번외
오일러 트레일이란 시작하는 점과 끝나는 점이 다른 오일러 회로 문제이다. 시작점과 끝점에 간선을 하나 추가하고 나서 오일러 서킷 문제로 변환하면 똑같은 문제가 된다.
'Computer science & Infra > DSA' 카테고리의 다른 글
[Graph] MST / 최소 스패닝 트리 / 최소 신장 트리 (0) | 2023.04.13 |
---|---|
[Graph] BFS 그래프 너비 우선 탐색과 최단 거리 (0) | 2023.02.22 |
[Divide and Conquer] 이진 탐색 알고리즘 (0) | 2023.02.22 |
[Graph] DFS 그래프 깊이 우선 탐색 (0) | 2023.01.31 |
[Graph] 그래프의 기본과 사용 예시들 (2) | 2023.01.30 |
Comments