일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 해시
- 다익스트라
- 브루트포스
- 다이나믹 프로그래밍
- BFS
- 자료구조
- 투포인터
- 수학
- GROUP BY
- DFS
- 그리디
- 그래프 탐색
- 트리
- 에라토스테네스의 체
- 플로이드-워셜
- 재귀
- join
- 구현
- 누적합
- 크루스칼
- 분할정복
- MST
- DP
- 그래프 이론
- 우선순위큐
- 시뮬레이션
- 다시
- 다이나믹프로그래밍
- 백트래킹
- 서브쿼리
- Today
- Total
기록하고 까먹지 말기
1967 본문
날짜 : 2023. 03. 14
사용 언어 : python
문제

코드
import sys
sys.setrecursionlimit(10**9)
n = int(sys.stdin.readline())
graph = [[] for _ in range(n + 1)]
def dfs(now, d): # 노드번호, 길이
for i in graph[now]:
if dist[i[0]] == -1: # 길이 최신화 x
dist[i[0]] = d + i[1]
dfs(i[0], d + i[1])
for _ in range(n - 1):
a, b, c = map(int, sys.stdin.readline().split()) # 트리 입력
graph[a].append([b, c])
graph[b].append([a, c])
# 1번 노드에서 가장 먼 노드를 찾는다
dist = [-1] * (n + 1)
dist[1] = 0 # 본인 노드
dfs(1, 0)
# 가장 먼 노드의 인덱스 확인
start = dist.index(max(dist))
dist = [-1] * (n + 1)
dist[start] = 0
dfs(start, 0)
print(max(dist)) # start 에서 가장 먼 노드를 찾고 그 길이 리턴 -> 지름
풀이
- 지름을 구하는 경우는 다음과 같다.
1. 트리에서 정점 x를 찾는다.
2. 정점 x에서 가장 긴 거리에 있는 정점 a를 찾는다.
3. 정점 a에서 가장 긴 거리에 있는 정점 b를 찾는다.
지름은 a와 b를 잇는 경로의 길이이다.
- 각 노드간 거리를 파악하기 위해 방향성이 없는 그래프를 만들고 임의의 노드(코드에서는 1)를 기준으로 dfs를 실행한다.
- 이후 해당 노드에서 가장 먼 거리에 있는 노드(start)를 찾고 그 노드를 기준으로 dfs를 실행 -> 가장 먼 거리의 노드를 찾는다.
- 그리고 start와 이를 기준으로 dfs를 돌려 나온 노드간 거리가 이 트리의 길이가 된다.
알게된 점
- 트리의 지름을 구하는 원리를 찾지 못해 꽤 많이 고민했다.
- 각 노드를 기준으로 가장 먼 거리의 노드 2개를 구해서 해볼까 했는게 구현방식이 떠오르지 않았다.
참고 사이트
- https://kyun2da.github.io/2021/05/04/tree's_diameter/
[백준 / Python] 1967 트리의 지름 - Kyun2da Blog
1️⃣ 서론
Kyun2da.github.io
- 트리의 지름 구하는 원리(귀류법으로 증명) : https://blog.myungwoo.kr/112
트리의 지름 구하기
트리에서 지름이란, 가장 먼 두 정점 사이의 거리 혹은 가장 먼 두 정점을 연결하는 경로를 의미한다. 선형 시간안에 트리에서 지름을 구하는 방법은 다음과 같다: 1. 트리에서 임의의 정점 $x$를
blog.myungwoo.kr