티스토리 뷰
https://www.acmicpc.net/problem/7812
7812번: 중앙 트리
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫 줄에는 트리의 정점의 수 n이 주어진다. (1 ≤ n ≤ 10,000) 각 정점은 0번부터 n-1번까지 번호가 붙여져 있다. 다음 n-1개 줄
www.acmicpc.net
이 문제는 전에 올렸던 사무실 이전과 같은 방식의 문제이다.
https://joseph0528.tistory.com/77
BOJ 16121(사무실 이전)풀이
https://www.acmicpc.net/problem/16121 16121번: 사무실 이전 첫 번째 줄에 모든 사무실 후보에 대한 모든 직원의 출근 경로 길이의 제곱을 모두 합한 값을 998,244,353으로 나눈 나머지를 출력한다. www.acmicp..
joseph0528.tistory.com
이 글을 참고하면서 읽는 걸 추천하다.
이 문제도 똑같이 자식들간의 거리합과 부모들 간의 거리합을 따로 구해줄 것이다. 자식들 간의 거리합은 골드 급의 생각이라 간단하게만 설명하겠다.
자식들 간의 거리는 현재 x노드에 대해 x노드의 자식들의 값+간선 값*자식들의 개수를 더해주면 된다.
이게 끝이다.
이제 부모들간의 거리합을 구해줘야 하는데 이것도 위에서부터 내려오면서 x노드의 자식들 중 x [i] 노드로 탐색을 한다고 했을 때 (x노드의 값에 x [i] 노드의 값과 두 노드를 연결하는 값을 빼준 값)+부모 노드의 값(첫 번째에서 구한 값이 아닌 두 번째에서 구한 값)+(x노드가 포함하는 자식 개수-x [i] 노드가 포함하는 자식 노드 개수)*(두 노드를 이으는 간선 값)를 구해주면 된다.
이제 마지막에 n번 돌면서 합이 가장 작은걸 구해주면 된다.
import sys,math
inf=math.inf
input=sys.stdin.readline
sys.setrecursionlimit(10**9)
def f(x,lt):
v=0
cnt=1
for next in graph[x]:
if next[0]!=lt:
rt=f(next[0],x)
cnt+=rt[1]
v+=rt[0]+rt[1]*next[1]
dp[x]=[v,cnt]
return dp[x]
def ff(x,lt,vc):
for next in graph[x]:
if next[0]!=lt:
#print(dp1[x],dp[x][1],next[1],dp[x][0],dp[next][0])
dp1[next[0]]=dp1[x]+(dp[x][1]-dp[next[0]][1]+vc)*next[1]+(dp[x][0]-dp[next[0]][0]-dp[next[0]][1]*next[1])
ff(next[0],x,vc+dp[x][1]-dp[next[0]][1])
while 1:
a=int(input())
dp=[0]*(a+1)
dp1=[0]*(a+1)
if a==0:break
graph=[[]for i in range(a+1)]
for i in range(a-1):
c,d,e=map(int,input().split())
graph[c+1].append([d+1,e])
graph[d+1].append([c+1,e])
f(1,-1)
ff(1,-1,0)
#print(dp)
#print(dp1)
mi=inf
for i in range(1,a+1):
mi=min(mi,dp[i][0]+dp1[i])
print(mi)
'ps' 카테고리의 다른 글
BOJ 1005(ACM Craft)풀이 (0) | 2021.11.16 |
---|---|
BOJ 17668(시험)풀이 (0) | 2021.10.03 |
BOJ 16121(사무실 이전)풀이 (0) | 2021.09.11 |
BOJ 2405(세 수, 두 M)풀이 (0) | 2021.09.02 |
BOJ 17274(카드 공장 (Large))풀이 (0) | 2021.08.15 |
- Total
- Today
- Yesterday
- BOJ
- 최소 스패닝 트리
- 이분 탐색
- Python
- discord bot
- 그래프 이론
- C++
- 느리게 갱신되는 세그먼트 트리
- 정렬
- codeforces
- 알고리즘
- 그래프 탐색
- 세그먼트 트리
- KOI
- 선분 교차 판정
- 완전 탐색
- 수학
- 트리에서의 다이나믹 프로그래밍
- 자료 구조
- 다이나믹 프로그래밍
- 구현
- 깊이 우선 탐색
- 개발
- 트리
- 그리디 알고리즘
- 누적 합
- 이분매칭
- A Dance of Fire and Ice
- 잡봇
- 자료구조
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |