본문 바로가기
Algorithm/Baekjoon

1167. 트리의 지름 (Python)

by 원만사 2022. 4. 11.
반응형
 

1167번: 트리의 지름

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

www.acmicpc.net

 

풀이

 트리의 지름을 구하려면 임의의 노드에서 가장 멀리 있는 노드 u를 구한다. 그 후 다시 노드 u에서 가장 멀리 있는 노드 v를 구한다. 이렇게 구한 노드 u와 노드 v의 길이가 트리의 지름이 된다.

 

 이에 대한 증명은 링크를 참고하자...

 

코드

from collections import deque
import sys 

input = sys.stdin.readline

# node에서 가장 멀리 떨어져 있는 노드를 구하기 위한 bfs 함수 
def bfs(node):
    visited = [False for _ in range(V+1)]
    visited[node] = True 

    q = deque()
    q.append((node, 0))

    maxCost = 0 # 가장 멀리 떨어져 있는 거리
    resNode = -1 # maxCost에 해당하는 노드

    while q:
        nowNode, nowCost = q.popleft()

        for (nextNode, cost) in graph[nowNode]:
            if visited[nextNode]:
                continue 
            
            visited[nextNode] = True
            nextCost = nowCost + cost 
            q.append((nextNode, nextCost))

            if nextCost > maxCost:
                maxCost = nextCost
                resNode = nextNode
    
    global res 
    res = max(res, maxCost)

    return resNode


if __name__ == '__main__':
    V = int(input())
    graph = [[] for _ in range(V+1)]

    for _ in range(V):
        edges = list(map(int, input().split()))
        edges.pop()
        node = edges.pop(0)

        for i in range(0, len(edges), 2):
            nextNode = edges[i]
            cost = edges[i+1]
            graph[node].append((nextNode, cost))

    res = 0 

    u = bfs(1) # 임의의 노드 1번 노드에서 가장 멀리 떨어져 있는 노드 u를 찾는다.
    v = bfs(u) # 노드 u에서 가장 멀리 떨어져 있는 노드 v를 찾는다.

    # 노드 u와 노드 v의 거리가 트리의 지름이 된다.
    print(res)
반응형

'Algorithm > Baekjoon' 카테고리의 다른 글

3190. 뱀 (Python)  (0) 2022.04.13
1027. 고층 건물 (Python)  (0) 2022.04.12
1005. ACM Craft (Python)  (0) 2022.04.11
2632. 피자판매 (Python)  (0) 2022.04.11
10836. 여왕벌 (Python)  (0) 2022.04.09

댓글