Algorithm & Data Structure/Baekjoon

[Baekjoon/python] 트리의 지름 #1167

ju_young 2023. 6. 4. 19:53
728x90

https://www.acmicpc.net/problem/1167

 

1167번: 트리의 지름

트리가 입력으로 주어진다. 먼저 첫 번째 줄에서는 트리의 정점의 개수 V가 주어지고 (2 ≤ V ≤ 100,000)둘째 줄부터 V개의 줄에 걸쳐 간선의 정보가 다음과 같이 주어진다. 정점 번호는 1부터 V까지

www.acmicpc.net

문제

트리의 지름이란, 트리에서 임의의 사이의 거리 가장 것을 말한다. 트리의 지름을 구하는 프로그램을 작성하시오.

코드

  • 다익스트라 알고리즘 적용
  • 거리를 음수로 사용하여 최단거리문제로 정의
  • 풀이 참고 + 주석 설명 참고
import sys
import heapq
from collections import defaultdict


def dijkstra(graph, v, src):
    heap = [(0, src)]
    visited = set()
    min_dist = [1001] * v
    while heap:
        cur_weight, cur_node = heapq.heappop(heap)
        min_dist[cur_node] = cur_weight
        visited.add(cur_node)
        if len(visited) == V:
            return min_dist.index(min(min_dist)), min(min_dist)
        for nxt_node, nxt_weight in graph[cur_node]:
            if nxt_node in visited:
                continue
            heapq.heappush(heap, (cur_weight + nxt_weight, nxt_node))

input = sys.stdin.readline

V = int(input())
graph = defaultdict(list)
for _ in range(V):
    line = list(map(int, input().split()))
    cur_node, edges = line[0], line[1:-1]
    nxt_node, weight = 0, 1
    while weight < len(edges):
        graph[cur_node].append([edges[nxt_node], -edges[weight]])
        nxt_node += 2
        weight += 2

# 1. 임의의 노드에서 가장 먼 노드 탐색
# 2. `1`에서 구한 노드에서 가장 먼 노드 탐색
# 3. `2`에서 구한 노드에서 구한 가장 먼 거리가 최대 지름
node1, _ = dijkstra(graph, V + 1, 1)
_, min_weight = dijkstra(graph, V + 1, node1)
print(-min_weight)
728x90