본문 바로가기
알고리즘/문제풀이

BOJ 2533 사회망 서비스(SNS)

by sy.cho__ 2017. 9. 24.

2533 사회망 서비스(SNS) [https://www.acmicpc.net/problem/2533]


문제를 읽어보시면 친구와의 관계는 Tree로 표현될 수 있다는 것을 알 수 있습니다.


이 문제는 트리 탐색과 메모리제이션을 동시에 하면서 해결 할 수 있습니다.


아래와 같은 친구관계를 가지고 있는 트리를 이용해 설명하겠습니다.



메모리제이션을 이용할 dp테이블은 다음과 같습니다


dp[i][state] : i번째 정점을 root로 가지고 있는 Subtree 에서의 최소 얼리어답터 수

    : state == 0  -> 정점 i가 얼리어답터가 아닌 경우

    : state == 1  -> 정점 i가 얼리어답터인 경우


우선 루트노드(1번 노드)부터 Leaf 노드까지 탐색합니다. 

제일 첫번째 방문하는 Leaf 노드는 5번 노드가 될 것입니다. 


5번 노드는 자식노드가 없으므로

dp[5][0] = 0 / dp[5][1] = 1 과 같이 초기화 할 수 있습니다.


방문을 마치고 다시 2번 노드로 돌아갑니다.


여기서 dp[2][0] 은 dp[5][1] 의 값을 더한 값이 됩니다.

그 이유는 2번 노드가 얼리어답터가 아닌 경우 친구는 무조건 얼리어답터가 되어야하기 때문입니다.(문제조건)


dp[2][1] 은 현재 노드가 얼리어답터 이므로 친구의 얼리어 답터의 유무가 상관없습니다. 

그러므로  dp[5][0] 과 dp[5][1] 중 작은 값을 더해주면 됩니다.


이와 같이 bottom부터 root까지 차례대로 얼리어답터 수를 갱신하면서 값을 찾으면 됩니다.


아래 주소에서 정답코드 확인가능합니다.

[https://github.com/choseungyoon/Algorithm/blob/master/2533.cpp]


설명이 잘못 되었거나 이해가 안되시는 부분 있으면 답글 달아주시면 감사드립니다!


반응형

'알고리즘 > 문제풀이' 카테고리의 다른 글

BOJ 1753 최단경로  (0) 2017.10.06
BOJ 11811 데스스타  (0) 2017.10.04
BOJ 1525 퍼즐  (0) 2017.09.25