728x90
https://www.acmicpc.net/problem/1967
1967번: 트리의 지름
파일의 첫 번째 줄은 노드의 개수 n(1 ≤ n ≤ 10,000)이다. 둘째 줄부터 n-1개의 줄에 각 간선에 대한 정보가 들어온다. 간선에 대한 정보는 세 개의 정수로 이루어져 있다. 첫 번째 정수는 간선이 연
www.acmicpc.net
아무 노드에서 가장 먼 노드와 해당 노드에서 가장 먼 노드의 길이를 탐색하면 풀 수 있는 문제입니다. 어떤 노드에서 가장 먼 노드를 탐색하면 이는 지름의 양 끝점 중 한 점에 해당하므로 타당한 풀이법 이라고 할 수 있습니다.
import heapq
import sys
input = sys.stdin.readline
def solution(n, data_list):
# 다익스트라
# 트리 / tree[i] = [[i 와 연결된 노드, 거리], ... ]
tree = [[] for _ in range(n+1)]
for parent, child, dir in data_list:
tree[parent].append([child, dir])
tree[child].append([parent, dir])
# 루트에서 가장 먼 노드
far_root_dir, far_root_node = dijkstra(1, tree, n)
# 에서 가장 먼 노드
far_far_dir, far_far_node = dijkstra(far_root_node, tree, n)
# 출력
print(far_far_dir)
# 다익스트라
def dijkstra(start, tree, n):
# 큐
queue = [[0, start]]
# 시스템상 최대거리
inf = float('INF')
# 노드까지의 최단 거리 리스트
min_dir_list = [inf for _ in range(n+1)]
min_dir_list[start] = 0
# 가장 긴 길이
far_dir = 0
# 가장 먼 노드
far_node = 0
# 순회
while queue:
# 현재 거리, 현재 노드
now_dir, now_node = heapq.heappop(queue)
# 현재 거리가 최단 거리보다 크면 패스
if now_dir > min_dir_list[now_node]:
continue
# 자식 순회
for next_node, dir in tree[now_node]:
# 다음 거리
next_dir = now_dir + dir
# 다음 거리가 최단거리보다 짧으면
if next_dir < min_dir_list[next_node]:
heapq.heappush(queue, [next_dir, next_node])
# 최단거리 리스트에 최신화
min_dir_list[next_node] = next_dir
# 가장 먼 노드의 거리보다 다음 거리가 길면 가장 먼 노드 최신화
if far_dir < next_dir:
far_dir = next_dir
far_node = next_node
return far_dir, far_node
n = int(input())
data_list = [list(map(int, input().strip().split())) for _ in range(n-1)]
solution(n, data_list)
728x90
'Coding Test > BaekJoon_Python' 카테고리의 다른 글
백준 2607 <비슷한 단어> Python (1) | 2024.01.27 |
---|---|
백준 17608 <막대기> Python (1) | 2024.01.24 |
백준 10282 <해킹> Python (2) | 2024.01.10 |
백준 3977 <축구 전술> Python (1) | 2024.01.05 |
백준 4196 <도미노> Python (1) | 2024.01.03 |