https://www.acmicpc.net/problem/2533
2533번: 사회망 서비스(SNS)
첫 번째 줄에는 친구 관계 트리의 정점 개수 N이 주어진다. 단, 2 ≤ N ≤ 1,000,000이며, 각 정점은 1부터 N까지 일련번호로 표현된다. 두 번째 줄부터 N-1개의 줄에는 각 줄마다 친구 관계 트리의 에
www.acmicpc.net
풀이 과정
- 아무 점이나 루트로 잡아서 진행한다.
- 현재 점에 연결된 방문하지 않은 모든 점들을 방문하면서 DP테이블을 갱신한다.
- 초기 모든 DP테이블은 점마다 [0, 1]로 설정한다.
- DP[i][0]은 루트가 i점인 부분 트리에서 i점이 얼리어답터가 아닐 때의 전체 얼리어답터 최소 개수
- DP[i][1]은 루트가 i점인 부분 트리에서 i점이 얼리어답터일 때의 전체 얼리어답터 최소 개수
- 따라서, DP[i][0]은 다음 점에서는 얼리어답터가 나와야 하므로 DP[다음 점][1]을 더해준다.
- DP[i][1]은 다음 점에서 얼리어답터가 나올수도 있고 나오지 않을수도 있으므로 DP[다음 점][0]과 DP[다음 점][1]의 최솟값을 더해 준다.
- 루트 노드에서의 DP 테이블의 최솟값을 출력시켜준다.
소스 코드
import sys
sys.setrecursionlimit(10**6)
input = lambda: sys.stdin.readline().rstrip()
n = int(input())
tree = [[] for _ in range(n+1)]
for _ in range(n-1):
src, dest = map(int, input().split())
tree[src].append(dest)
tree[dest].append(src)
root = 1
dp = [[0, 1] for _ in range(n+1)]
visited = [False] * (n+1)
def solve(node):
visited[node] = True
for next_node in tree[node]:
if not visited[next_node]:
solve(next_node)
dp[node][0] += dp[next_node][1]
dp[node][1] += min(dp[next_node][0], dp[next_node][1])
solve(root)
print(min(dp[root]))
'알고리즘[Python] > 백준 알고리즘' 카테고리의 다른 글
[ 21276 ] [ 위상 정렬 ] 계보 복원가 호석 (0) | 2021.12.28 |
---|---|
[ 1766 ] [ 위상 정렬 ] 문제집 (0) | 2021.12.27 |
[ 20955 ] [ Union-Find ] 민서의 응급 수술 (0) | 2021.12.23 |
[ 22856 ] [ Tree ] 트리 순회 (0) | 2021.12.20 |
[ 2602 ] [ DP ] 돌다리 건너기 (0) | 2021.12.16 |