◦ Algorithm/Python
백준 촌수계산 2644 DFS
밍블리s2
2023. 4. 4. 07:47
https://www.acmicpc.net/problem/2644
2644번: 촌수계산
사람들은 1, 2, 3, …, n (1 ≤ n ≤ 100)의 연속된 번호로 각각 표시된다. 입력 파일의 첫째 줄에는 전체 사람의 수 n이 주어지고, 둘째 줄에는 촌수를 계산해야 하는 서로 다른 두 사람의 번호가 주어
www.acmicpc.net
- 노드가 연결된 그래프, 방문배열, 결과값 저장할 장소를 만든다
- dfs에서 매개변수로 방문할 노드와 몇 번째 방문인지를 나타내는 cnt를 받는다
- 만약 방문 중인 노드와 타겟 노드와 같다면 현재 몇 번째 방문인지를 result에 append한다
- 그렇지 않을 경우 재귀로 dfs를 호출한다
- 만약 result 안에 아무것도 없으면 아무 관계도 아니므로 -1을 리턴하고 값이 있으면 result[0]의 값을 리턴한다.
- dfs를 재귀로 구현할 때 cnt를 어떻게 내보내야할지 고민이었는데, 이렇게 result라는 global 변수를 지정해두고 cnt를 result에 저장해주면 된다는 점을 배웠다
N = int(input())
x, y = map(int, input().split())
M = int(input())
graph = [[] for _ in range(N+1)]
visited = [False] * (N+1)
result = []
for _ in range(M):
p, c = map(int, input().split())
graph[p].append(c)
graph[c].append(p)
def dfs(v, cnt):
if visited[v]:
return
cnt += 1
visited[v] = True
if v == y:
result.append(cnt)
for i in graph[v]:
if not visited[i]:
dfs(i, cnt)
dfs(x,0)
if len(result) == 0:
print(-1)
else:
print(result[0]-1)