Programming/백준
[골드 5] 백준 - 노드사이의 거리 (파이썬)
pental
2025. 4. 3. 15:39
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])