장점
단점
한가지 정점과 연결된 모든 정점을 탐색해야 하는 경우
일반적인 dfs알고리즘을 사용하면된다. 해당 지점 방문 여부를 체크할 배열(visit)을 선언하고, 그 정점과 인접한 정점중 아직 방문하지 않은 곳을 재귀호출하는 방식으로 풀이가 가능하다.
경로를 찾아야 하는 경우
일반적인 방법이 아니기 떄문에, dfs알고리즘을 약간 변형해야한다.
사이클이 존재하는 경로를 찾는 경우
이전에 방문했던곳을 다시 방문하는 원형 반복 사이클이 생겼다는것을 의미하는데, 일반적인 dfs는 방문한곳을 다시 방문하지 않기 떄문에, 기존 알고리즘에 변형을 주어 문제를 해결해야 한다.
관련 문제 - https://www.acmicpc.net/problem/9466
dfs(G, v)
visit(v)
visited[v] ← true
for all w ∈ (v 인접 정점) do
if w가 아직 방문되지 않았으면 then
pred[w] ← v
dfs(G, w)
end dfs()
def dfs(graph, v, visited, pred):
global result
# 현재 정점을 방문 처리
visited[v] = True
result.append(v)
# 현재 정점의 인접 정점을 재귀적으로 방문
for i in range(7):
if graph[v][i] and (not visited[i]):
pred[i] = v
dfs(graph, i, visited, pred)
from collections import deque
# n: 정점의 개수, m: 간선의 개수, v:탐색을 시작할 정점의 번호
n, m, v = map(int,input().split())
graph = [[] for _ in range(n+1)]
for i in range(m):
a,b = map(int,input().split())
graph[a].append(b)
graph[b].append(a)
graph[a].sort()
graph[b].sort()
def dfs(graph, v, visited):
# 현재 노드를 방문 처리
visited[v] = True
print(v, end=' ')
# 현재 노드와 연결된 다른 노드를 재귀적으로 방문
for j in graph[v]:
if not visited[j]:
dfs(graph, j, visited)
visited = [False] * (n+1)
dfs(graph, v, visited)