본문 바로가기

PS 짬통/골드

2213 트리의 독립집합

https://www.acmicpc.net/problem/2213

 

2213번: 트리의 독립집합

첫째 줄에 트리의 정점의 수 n이 주어진다. n은 10,000이하인 양의 정수이다. 1부터 n사이의 정수가 트리의 정점이라고 가정한다. 둘째 줄에는 n개의 정수 w1, w2, ..., wn이 주어지는데, wi는 정점 i의

www.acmicpc.net

 

이 문제를 풀기전에 2533번  https://kimximya.tistory.com/54 을 풀었어서 스무스 했다

트리 DP에 역추적 하면 풀린다, 골드1 짜리 문제는 아닌 듯 하다

 

트리 DP 방법론

- 트리를 짠다

- int[][] DP = new int[N+1][2]  짜리 디피테이블을 만든다

- dfs를 돌린다

- DP[x][0] 은 집합에 x를 포함하지 않았다는 의미

- DP[x][1] 은 집합에 x를 포함했다는 의미

- DP[x][1] = W[x] 로 일단 설정해준다

- 그 후 자식 정점에 대해서 DP[x][0] += Math.max( DP[자식][0], DP[자식][1] ) 을 해준다

- DP[X][1] 은, 자기 자신이 포함됐으므로 자식은 포함되면 안된다, 그러므로

- DP[X][1] += DP[자식][0]

- DFS가 끝나고 DP[루트][0], DP[루트][1] 중 더 큰걸 출력해준다

 

역추적 방법론

- 우선순위 큐를 만든다

- 탑다운으로 조건 검사를 할꺼다

- dfs 함수 파라미터에 isPossible 불린 판별 인자를 추가해준다

- DFS를 또 돌린다

- 첫 시작의 isPossible 은 true다

- 만약 isPossible == true 일 경우, 해당 정점에서의 DP테이블을 조사한다

-  DP[x][1] > DP[x][0] 이라면, 즉, 해당 정점을 독립집합에 넣는게 값이 더 크다면

- 우선순위 큐에 x를 추가하고 다음 dfs에 인자를 false로 넣어준다

- 더 작다면 아무 것도 안한다

- isPossible == false 라면 다음 dfs 다음 인자를 true 로 넣어준다

- 대충 이렇게 한다음 우선순위큐 출력해주면 독립집합 정렬되서 나옴

 

https://github.com/KimximyaFan/Random-Defense/blob/main/C0049.java

'PS 짬통 > 골드' 카테고리의 다른 글

25308 방사형 그래프  (2) 2023.10.24
1949 우수 마을  (0) 2023.10.20
2533 사회망 서비스(SNS)  (0) 2023.10.16
15681 트리와 쿼리  (0) 2023.10.12
11780 플로이드 2  (0) 2023.10.11