일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- BFS
- 다이나믹 프로그래밍
- Servlet
- 프로그래머스
- 포두부 보쌈
- 양꼬치
- 백준
- 고모네 콩탕
- Spring
- 설탕 배달
- 문자열 압축
- dp
- 1로 만들기
- 완도산회
- 서블릿
- 스프링
- 2020 KAKAO BLIND
- 알고리즘
- 2589
- 맛집 투어
- HTTP API
- 맛집
- 동적 프로그래밍
- 쓰레드 풀
- 투어
- mvc
- 호유동
- 2839
- 스프링 MVC
- 2638
- Today
- Total
프로그래밍 공방
[Tree] 중앙 정점 본문
트리의 중앙 정점
트리에서 다른 모든 정점까지의 거리의 합이 최소가 되는 정점
중앙 정점을 구하기 위해서는 트리의 임의의 정점에서 다른 모든 정점까지의 거리의 합을 알아야 한다.
i에서 i의 서브트리에 속하는 모든 정점들까지의 거리의 합을 vSum[i],
i에서 i의 서브트리에 속하지 않는 모든 정점들까지의 거리의 합을 rSum[i] 이라 할 때,
정점 i에서 다른 모든 정점까지의 거리의 합은 vSum[i] + rSum[i]로 나타낼 수 있다.
1. i에서 i의 서브트리에 속하는 모든 정점들까지의 거리의 합 (vSum[i])
vSum[i]을 구하기 위해서는 i의 직계 자손들을 서브트리의 루트로 하는 정점들의 vSum[i의 직계자손]와 그 서브트리에 속하는 총 정점의 수(vCount[i의 직계자손])가 필요하다.
i와 i의 직계자손의 거리가 d라고 가정하면 vSum[i]는 아래와 같이 표현할 수 있다.
vSum[i] = vSum[i의 직계자손] + (vCount[i의 직계자손] * d)
2. i에서 i의 서브트리에 속하지 않는 모든 정점들까지의 거리의 합 (rSum[i])
rSum[i]는 1번을 계산하면서 구해둔 vSum과 vCount를 활용해야 하며 아래 세 가지 경우를 합산하여 구할 수 있다.
(1) i의 부모노드에 속하지 않는 모든 정점들까지의 거리의 합 rSum[i의 parent]
rSum[i의 parent]는 root부터 차례로 구하기 때문에 i에 대한 rSum을 구할때는 구해져 있다. (root일 때는 rSum[root]=0, root 정점을 루트로 하는 서브트리에 속하지 않는 정점은 없다.)
(2) i의 부모노드에서 i의 부모노드의 서브트리에 속하면서 i의 서브트리에는 속하지 않는 정점들까지의 거리의 합
vSum[i의 parent] - (vSum[i] + (vCount[i] * d)) ( * d는 i와 i의 parent 까지의 거리)
(3) i의 서브트리에 속하지 않는 정점들이 i의 부모노드와 i 사이의 간선을 타고 들어오는 거리의 합
(vCount(root) - vCount[i]) * d
rSum[i] = rSum[i의 parent] + vSum[i의 parent] - (vSum[i] + (vCount[i] * d)) + (vCount(root) - vCount[i]) * d
'개발 > 알고리즘' 카테고리의 다른 글
크루스칼 알고리즘 : Kruskal's Algorithm (0) | 2021.03.08 |
---|---|
다익스트라 알고리즘 : Dijkstra Algorithm (0) | 2021.03.07 |
플로이드 와샬 : Floyd Warshall (0) | 2021.02.07 |
위상 정렬 : Topological Sorting (0) | 2021.01.27 |
Lower / Upper Bound : 하한 / 상한 알고리즘 (0) | 2020.12.05 |