[골드 5] 백준 - 노드사이의 거리 (파이썬)
글 작성자: pental

https://www.acmicpc.net/problem/1240
풀이
트리의 노드 N, 거리 구할 쌍의 개수 M을 초기에 입력받는디ㅏ.
N - 1개의 간선정보와 M개의 노드 쌍이 주어진다.
- 트리는 사이클이 없고, 두 노드사이의 경로가 항상 유일하게 존재한다.
- 따라서 s번 노드에서 DFS를 돌리면 모든 노드까지의 거리를 구할 수 있다.
- t번 노드까지의 누적 거리를 출력하면 s - t 거리이다.
for _ in range(N - 1): u, v, w = map(int, input().split()) u -= 1 v -= 1 adj[u].append((v, w)) adj[v].append((u, w))
트리의 간선을 입력 받고, 편의를 위해서 1씩 빼준다.
또한 양방향으로 연결하기 u, v를 각각 삽입한다.
visit = [False] * N dist = [0] * N def dfs(u): visit[u] = True for v, w in adj[u]: if not visit[v]: dist[v] = dist[u] + w dfs(v)
DFS로 탐색하며 dist[v] = dist[u] + w 를 통해서 누적 거리를 계산한다.
visit 배열을 통해서 중복 방문을 방지한다.
for _ in range(M): s, t = map(int, input().split()) s -= 1 t -= 1 visit = [False] * N dist = [0] * N dist[s] = 0 dfs(s) print(dist[t])
각 거리 쿼리마다 s에서 출발해 DFS로 거리를 측정하고, dist[t]가 s에서 t까지의 거리이다.
코드
# 백준 1240 - 노드사이의 거리 # 분류 : 트리 N, M = map(int, input().split()) adj = [[] for _ in range(N)] for _ in range(N - 1) : u, v, w = map(int, input().split()) u -= 1 v -= 1 adj[u].append((v, w)) adj[v].append((u, w)) visit = [False] * N dist = [0] * N def dfs(u) : visit[u] = True for v, w in adj[u] : if not visit[v] : dist[v] = dist[u] + w dfs(v) for _ in range(M) : s, t = map(int, input().split()) s -= 1 t -= 1 visit = [False] * N dist = [0] * N dist[s] = 0 dfs(s) print(dist[t])
'Programming > 백준' 카테고리의 다른 글
[브론즈 2] 백준 3040 - 백설 공주와 일곱 난쟁이 (파이썬) (0) | 2025.04.05 |
---|---|
[브론즈 4] 백준 11945 - 뜨거운 붕어빵 (파이썬) (0) | 2025.04.04 |
[실버 4] 백준 1269 - 대칭 차집합 (파이썬) (0) | 2025.04.02 |
백준 2495 - 연속구간 (파이썬) (0) | 2025.04.02 |
백준 2456 - 나는 학급회장이다 (파이썬) (0) | 2025.04.01 |
댓글
이 글 공유하기
다른 글
-
[브론즈 2] 백준 3040 - 백설 공주와 일곱 난쟁이 (파이썬)
[브론즈 2] 백준 3040 - 백설 공주와 일곱 난쟁이 (파이썬)
2025.04.05 -
[브론즈 4] 백준 11945 - 뜨거운 붕어빵 (파이썬)
[브론즈 4] 백준 11945 - 뜨거운 붕어빵 (파이썬)
2025.04.04 -
[실버 4] 백준 1269 - 대칭 차집합 (파이썬)
[실버 4] 백준 1269 - 대칭 차집합 (파이썬)
2025.04.02 -
백준 2495 - 연속구간 (파이썬)
백준 2495 - 연속구간 (파이썬)
2025.04.02
댓글을 사용할 수 없습니다.