Algorithm PS/BOJ
[BOJ] 1967 / 트리의 지름 / Python 파이썬
migrationArc
2021. 6. 16. 08:55
[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
- 트리에서 임의의 정점 xx를 잡는다.
- 정점 xx에서 가장 먼 정점 yy를 찾는다
- 정점 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))
참고 블로그
트리의 지름 구하기
트리에서 지름이란, 가장 먼 두 정점 사이의 거리 혹은 가장 먼 두 정점을 연결하는 경로를 의미한다. 선형 시간안에 트리에서 지름을 구하는 방법은 다음과 같다: 1. 트리에서 임의의 정점 $x$를
blog.myungwoo.kr