본문 바로가기

boj

백준 1167 트리의 지름

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

 

1167번: 트리의 지름

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

www.acmicpc.net

개념도 ㅈ같고 구현도 ㅈ같았던 문제

가장 먼져 든 생각은, 트리의 모든 정점에서 모든 정점까지의 길이를 탐색하는거였는데, 말도안되서 포기했다.

가장 중요한건 트리의 개념이다.

 

트리는, 어떠한 두 노드를 선택해도, 경로는 항상 하나이다.

따라서, 임이의 한 점에서 가장 먼 정점은, 트리의 지름(가장 먼 정점) 의 두 정점 중 하나이다.

더욱 자세한 설명 참고 https://blog.myungwoo.kr/112 <- 진짜 천재인듯

 

따라서 한 점에서 (나는 1로 함) 최대거리인 정점 one을 구한다. (이왕 구하는 김에 최대거리까지 구한다.)(bfs)

그리고 bfs를 재사용하여 그 한 점에서 최대거리인 정점(이건 필요x)과 최대거리를 구한다.

이 최대거리가 트리의 지름이다.

 

심지어 그래프 입력하는것까지 ㅈ같은 문제였다. 치가떨린다.

 

#구현하기 어지럽다 ㅅㅂ
#트리에서 임의의 한 점에서의 최대의 길이는, 항상 지름 중 하나이다!

import sys
from collections import deque
input=sys.stdin.readline


def bfs(start): 
    one=0
    max_val=0
    visited=[-1 for _ in range(v+1)]
    visited[start]=0

    que=deque([start])
    
    while que:
        now=que.popleft()
        for next,weight in arr[now]:
            if visited[next]==-1:
                visited[next]=visited[now]+weight
                if visited[next]>max_val:
                    one=next
                    max_val=visited[next]
                que.append(next)
    return one,max_val #(지름의 정점중 1, <-까지의 최댓값 )
            
    


    


v=int(input())
arr=[[]for _ in range(v+1)]

for _ in range(v):
    tmp=list(map(int,input().strip().split()))
    
    current=tmp[0]
   
    for i in range(1,len(tmp)-1,2):
        arr[current].append([tmp[i],tmp[i+1]])
        #어지럽다진짜

one,max_val=bfs(1)
print(bfs(one)[1])

'boj' 카테고리의 다른 글

백준 1967 트리의 지름  (0) 2022.05.12
백준 11404플로이드  (0) 2022.05.12
백준 11725 트리의 부모 찾기  (0) 2022.05.11
백준 2250 트리의 높이와 너비  (0) 2022.05.10
백준 2580 스도쿠  (0) 2022.05.09