백준/Search

[bfs/백준] 2644번 : 촌수계산

ydin 2023. 5. 10. 15:31

- 문제 : https://www.acmicpc.net/problem/2644

 

문제 이해

그래프를 만든 뒤 두 노드 사이에 몇 개의 간선이 있는지 확인하는 문제라고 이해했다. 

간선 개수를 확인하기 위해 bfs를 이용해야 한다. 

(부모 -> 자식) 관계도 있지만 (자식 -> 부모) 관계도 있기 때문에 양방향 간선으로 graph에 저장해야한다. 

 

풀이 로직

- 찾아야하는 두 노드를 first, second라고 한 뒤 양방향 간선 정보를 graph에 저장한다.

- 탐색하는 노드가 찾고자 하는 second 노드라면 answer를 level로 업데이트 해준 뒤 break 한다.

- first노드 부터 그래프 탐색을 시작하는데, visit[first] = 1 을 해준다.

- queue는 [노드, first로부터의 간선 개수]로 설정했다. 

- 연결되었지만 방문하지 않은 노드를 중심으로 탐색한다. 탐색하면서 간선을 하나씩 지나가므로 level + 1 해준다. 

- if 문에서 break 해서 나온 answer라면 -1이 아닌 양수를 출력하고, 그렇지 않다면 -1을 출력한다. 

 

 

정답 풀이 

n = int(input())
first, second = map(int, input().split()) 
m = int(input())

graph = [[] for _ in range(n + 1)]
for _ in range(m):
    a, b = map(int, input().split())
    graph[a].append(b)
    graph[b].append(a) # 여기 추가 안 해서 틀림

queue = [[first, 0]]
visit = [0] * (n + 1)
visit[first] = 1
answer = -1
while queue:
    person, level = queue.pop(0)
    
    if person == second:
        answer = level
        break
    
    for each in graph[person]:
        if not visit[each]:
            visit[each] = 1
            queue.append([each, level + 1])

print(answer)