https://www.acmicpc.net/problem/1967
#Solution
상당히 오래 걸린 알고리즘이다. 다음과 같은 순서대로 풀이하였다.
1) BFS로 최상단(1) 부터 최하단 까지 정렬
2) 정렬된 bfs_node함수의 끝부터 pop하기
3) 최하단에서 각 node에 도달하는 단방향 값들 산출(diameter)
4) 최하단에서 각 node에 도달하는 단방향 최댓값 산출(max_node)
5) 각 node의 지름 최댓값 산출(max_diameter)
6) 지름 값 중 최댓값 출력(max(max_diameter))
node = int(input())
tree_info = [[] for _ in range(node + 1)]
for _ in range(node - 1):
parent, child, length = map(int, input().split())
tree_info[parent].append((child, length))
#BFS함수로 정렬하기
def bfs(graph_list, start):
visited = []
queue = [start]
while queue:
node = queue.pop(0)
visited.append(node)
for child in graph_list[node]:
queue.append(child[0])
return visited
#정렬에 쓸 리스트 생성
bfs_node = bfs(tree_info, 1)
max_node = [0 for _ in range(node + 1)]
diameter = [[0] for _ in range(node + 1)]
max_diameter = [0 for _ in range(node + 1)]
#최하단의 노드부터 일방향 최댓값, 지름 최댓값 추출
while bfs_node:
temp = bfs_node.pop()
for child in tree_info[temp]:
try:
child_length = max_node[child[0]] + child[1]
except:
child_length = child[1]
diameter[temp].append(child_length)
max_node[temp] = max(diameter[temp])
max_diameter[temp] += max(diameter[temp])
diameter[temp].remove(max(diameter[temp]))
try:
max_diameter[temp] += max(diameter[temp])
except:
pass
#추출한 지름 값들 중 최댓값 출력
print(max(max_diameter))
'Programming [Python] > 백준 알고리즘 솔루션' 카테고리의 다른 글
#147 백준 파이썬 [1932] 정수 삼각형 (0) | 2019.10.24 |
---|---|
#146 백준 파이썬 [2606] 바이러스 - BFS (0) | 2019.10.23 |
#144 백준 파이썬 [1991] 트리 순회 (0) | 2019.10.22 |
#143 백준 파이썬 [11725] 트리의 부모 찾기 (0) | 2019.10.22 |
#142 백준 파이썬 [2163] 초콜릿 자르기 (0) | 2019.10.14 |