몽상실현개발주의

[BOJ] 1967 / 트리의 지름 / Python 파이썬 본문

Algorithm PS/BOJ

[BOJ] 1967 / 트리의 지름 / Python 파이썬

migrationArc 2021. 6. 16. 08:55

[BOJ] 1967 / 트리의 지름 / Python 파이썬

[BOJ] 1967 / 트리의 지름 / Python 파이썬

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

 

1967번: 트리의 지름

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

www.acmicpc.net

 

풀이

전날 풀었던 [BOJ] 1167 / 트리의 지름 / Python 파이썬 문제와 같이 Tree 의 지름을 구하는 문제이다.

 

다시 복습하자면,

 

  • Tree 의 지름 : 가장 먼 두 정점 사이의 거리 혹은 가장 먼 두 정점을 연결하는 경로

 

  • 선형 시간내에 Tree 의 지름을 구하는 Algorithm
  1. 트리에서 임의의 정점 xx를 잡는다. 
  2. 정점 xx에서 가장 먼 정점 yy를 찾는다
  3. 정점 yy에서 가장 먼 정점 zz를 찾는다.

 

import sys
from collections import deque


def BFS(start, finish=0):
    global N

    dq = deque()
    dq.append((start, 0))

    visited = [0] * (N+1)

    res = 0
    maxNode = 0

    while dq:
        f, add = dq.popleft()
        visited[f] = 1

        if finish and f == finish:
            return add

        for info in tree[f]:
            if visited[info[0]]:
                continue

            if res < add+info[1]:
                res = add + info[1]
                maxNode = info[0]
            dq.append((info[0], add+info[1]))

    return maxNode


input = sys.stdin.readline

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

for _ in range(N-1):
    r, c, l = map(int, input().split())
    tree[r].append((c, l))
    tree[c].append((r, l))

v = BFS(1)
e = BFS(v)

print(BFS(v, e))

 

 


참고 블로그

https://blog.myungwoo.kr/112

 

트리의 지름 구하기

트리에서 지름이란, 가장 먼 두 정점 사이의 거리 혹은 가장 먼 두 정점을 연결하는 경로를 의미한다. 선형 시간안에 트리에서 지름을 구하는 방법은 다음과 같다: 1. 트리에서 임의의 정점 $x$를

blog.myungwoo.kr

 

Comments