https://www.acmicpc.net/problem/20188
20188번: 등산 마니아
동네 뒷 산에는 등산로가 있다. 등산로는 N개의 작은 오두막들이 N −1개의 오솔길로 이어진 형태이다. 한 오솔길은 두 개의 오두막을 양 방향으로 연결한다. 한 오솔길의 길이는 1이다. 어떤 오
www.acmicpc.net
N = int(input())
arr = [[] for _ in range(N+1)]
for _ in range(N-1):
a, b = map(int,input().split())
arr[a].append(b) # 인접 리스트 생성
arr[b].append(a)
d = [0] * (N+1)
res = 0
def dfs(me,parent): # 현재/부모
global res
for child in arr[me]:
if child != parent: # 자식노드와 부모노드가 같지 않은 경우에만(역방향 방지)
dfs(child,me)
d[me] += d[child]+1 # 현재 노드부터 자식노드의 모든 하위 노드들까지 경로 길이 저장
# 현재 노드를 거쳐가는 모든 가능한 경로의 길이
val = (d[me] + 1) * (N - (d[me] + 1)) + (d[me] * (d[me] + 1) // 2)
# 현재 노드까지 거친(+1) 경로의 길이 * 현재 노드를 거친(+1) 이후에 남은 노드들까지의 길이
# + 현재 노드의 하위 노드들 간의 경로 길이의 합(현재노드 거치지 않은)->중복방지로 2 나눔
if me != 1:
res += val
dfs(1,0)
print(res)
why..?
'백준' 카테고리의 다른 글
백준 2212. 센서 (0) | 2023.10.20 |
---|---|
백준 1459. 걷기 (0) | 2023.10.19 |
백준 1459. 걷기 (0) | 2023.10.18 |
백준 2195. 문자열 복사 (0) | 2023.10.10 |
백준 14503. 로봇 청소기 (0) | 2023.09.22 |