📊알고리즘, 문제풀이/📈문제풀이 (PS)

[알고리즘][Python] 백준 1967 트리의 지름 문제 풀이

Written by Donghak Park

문제 출처 : www.acmicpc.net/problem/1967

 

1967번: 트리의 지름

파일의 첫 번째 줄은 노드의 개수 n(1 ≤ n ≤ 10,000)이다. 둘째 줄부터 n-1개의 줄에 각 간선에 대한 정보가 들어온다. 간선에 대한 정보는 세 개의 정수로 이루어져 있다. 첫 번째 정수는 간선이 연

www.acmicpc.net


문제 해석 : 트리의 지름을 구하는 문제이다. 트리의 지름이란 가장 긴 cost를 가지는 구간을 말한다.

 

문제 풀이 : 트리의 지름을 구하는 방법은 아무 정점에서 임의의 정점까지의 거리를 구하고 그 중 가장 먼 거리를 가지는 도착지를 시작지점으로 하여 다시 한번 거리를 구하여 가장 긴 것을 찾으면 된다. 이는 증명된 방법으로 항상 참이다.

 

즉 가장 긴 구간을 포함하는 도착지로 부터 다시 한번 다익스트라 알고리즘을 사용하면 답을 구할 수 있다.


풀이 코드

import sys, heapq
INF = sys.maxsize
input = sys.stdin.readline

def dijstra(start):
    distance = [INF] * (N+1)
    Q = []

    heapq.heappush(Q, [0, start])
    distance[start] = 0

    while Q:
        now_cost, now_vertex = heapq.heappop(Q)

        for next_cost, next_vertex in graph[now_vertex]:
            if next_cost + now_cost < distance[next_vertex]:
                next_cost += now_cost
                distance[next_vertex] = next_cost
                heapq.heappush(Q, [next_cost, next_vertex])

    return distance

N = int(input())
graph = [[] for _ in range(N+1)]

for _ in range(N-1):
    start, end, cost = map(int, input().split())
    graph[start].append([cost, end])
    graph[end].append([cost, start])

temp = dijstra(1)[1:]
new_start = temp.index(max(temp))+1
answer = dijstra(new_start)[1:]
print(max(answer))

author : donghak park
contact : donghark03@naver.com

## 문제의 저작권은 백준 알고리즘 사이트에 있습니다. 혹시 문제가 되는 부분이 있으면 연락 바랍니다.