728x90
반응형
https://www.acmicpc.net/problem/2132
2132번: 나무 위의 벌레
첫째 줄에는 트리의 정점의 개수를 나타내는 정수 n(1 ≤ n ≤ 10,000)이 주어진다. 다음 줄에는 차례로 1번, 2번, …, n번 정점에 매달려 있는 열매의 개수가 주어진다. 다음 n-1개의 줄에는 트리의 각
www.acmicpc.net
<풀이>
트리의 지름이란 트리를 양쪽으로 잡아당겼을 때 가장 긴 거리이다.
이 트리의 지름을 구하는 방법은 임의의 한점에서 가장 먼 점(A)을 구하고, 해당 점(A)에서 가장 먼 점(B)를 연결하는 길이(AB)가 가장 큰 길이이다.
이 특징을 이용해 해당 문제를 풀 수 있다.
주의해야 할 점은 길이가 같은 지름이 여러개 존재할 수 있으므로, 길이가 같은 것을 다 구해서 모두 구해줘야 한다.
<전체 코드>
import sys
from collections import deque
N = int(sys.stdin.readline())
fruits = list(map(int, sys.stdin.readline().split()))
graph = {i: [] for i in range(1, N+1)}
for _ in range(N-1):
x, y = map(int, input().split())
graph[x].append(y)
graph[y].append(x)
def DFS(n):
distances = [-1]*(N+1)
que = deque([[n, n]])
distances[n] = [fruits[n-1], [n, n]]
maxDis = 0
nodeList = []
while que:
route = que.pop()
now = route[0]
for next in graph[now]:
if distances[next] == -1:
temp = route[:]
temp[0] = next
dis = distances[now][0]+fruits[next-1]
distances[next] = [dis, temp]
que.append(temp)
if maxDis < dis:
maxDis = dis
nodeList = [next]
elif maxDis == dis:
nodeList.append(next)
same = {}
for node in nodeList:
same[node] = [distances[node][0], min(distances[node][1])]
return same
dis = DFS(1)
maxDis = -1
ansNode = -1
for node in dis:
finalDis = DFS(node)
for ans in finalDis:
if maxDis < finalDis[ans][0]:
maxDis = finalDis[ans][0]
ansNode = finalDis[ans][1]
if maxDis == finalDis[ans][0]:
ansNode = min(finalDis[ans][1], ansNode)
if N == 1:
print(fruits[0], 1)
else:
print(maxDis, ansNode)
728x90
반응형
'# Coding > # 백준' 카테고리의 다른 글
파이썬 입력 시간 줄이기 (0) | 2025.01.10 |
---|---|
[백준 / 15809] 전국시대 - Python (0) | 2022.05.13 |
[백준 / 1167] 트리의 지름 - Python (0) | 2022.04.21 |
[백준 / 1967] 트리의 지름 - Python (0) | 2022.04.12 |
[백준 / 13913] 숨바꼭질 4 - Python (0) | 2022.04.07 |