※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 2533번 문제인 사회망 서비스(SNS)이다.
문제는 아래 링크를 확인하자.
2533번: 사회망 서비스(SNS)
페이스북, 트위터, 카카오톡과 같은 사회망 서비스(SNS)가 널리 사용됨에 따라, 사회망을 통하여 사람들이 어떻게 새로운 아이디어를 받아들이게 되는가를 이해하는 문제가 중요해졌다. 사회망
www.acmicpc.net
이 문제를 처음에는 단순히 깊이가 홀수인 노드와 짝수인 노드의 개수 가운데 작은 것을 출력하는 문제로 오해했다.
문제에 주어진 예시 그림이 잘못된 선입견을 준 것이다.
실제로는 단순히 깊이의 홀짝만으로 구분을 해서는 안 된다. 많은 dp문제에서 간격을 최대로 하여 움직여서 문제를 해결하지 못하는 것과 같은 원리이다.
따라서 이 문제는, 루트를 하나 정하고, 각 노드를 루트로 하는 부분트리에 대하여 이 노드가 early adapter인 경우와 아닌 경우의 (부분트리에서의) early adapter이 필요한 최소 수를 기록해나가는 것으로 해결할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <vector>
#include <cmath>
using std::cin; using std::cout;
using std::vector;
using std::pair;
using std::min;
int N;
vector<int> G[1000001];
pair<int,int> dfs(int current, int root) {
int early = 1, late = 0;
vector<int>::iterator iter = G[current].begin();
while (iter != G[current].end()) {
if (*iter == root) {
iter++; continue;
}
pair<int, int> temp = dfs(*iter, current);
early += min(temp.first, temp.second);
late += temp.first;
iter++;
}
return { early,late };
}
int main()
{
std::ios::sync_with_stdio(0);
cin.tie(0);
cin >> N;
int x, y;
for (int i = 1;i < N;i++) {
cin >> x >> y;
G[x].push_back(y);
G[y].push_back(x);
}
pair<int, int> ans = dfs(1, 0);
cout << min(ans.first, ans.second);
return 0;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 10273 // C++] 고대 동굴 탐사 (0) | 2021.03.28 |
---|---|
[BOJ 20171 // C++] Dessert Café (0) | 2021.03.27 |
[BOJ 2089 // C++] -2진수 (0) | 2021.03.25 |
[BOJ 11275 // C++] 트리의 부모 찾기 (0) | 2021.03.24 |
[BOJ 1915 // C++] 가장 큰 정사각형 (0) | 2021.03.23 |