티스토리 뷰
728x90
문제 링크
풀이
간단한 트리 DP 문제입니다.
1) 만약 현재 정점을 고르면 -> 자식들은 골라도 되고, 안골라도 됩니다.
2) 만약 현재 정점을 고르지 않으면 -> 모든 자식들을 골라야 합니다.
$d[now][k]$를 k가 0일때 안고름, 1일 때 고르는 상황의 최솟값이라고 합시다.
now의 모든 자식 next에 대해
$d[now][0] = \text{sum}(d[next][1])$
$d[now][1] = \text{sum(min}(d[next][0], d[next][1])) + 1$
입니다.
정답 코드
#include <bits/stdc++.h>
using namespace std;
using vi = vector<int>;
using vvi = vector<vi>;
int n, d[1'111'111][2]; // 0이면 안고름, 1이면 고름
vvi p;
bool chk[1'111'111];
void go(int now) {
chk[now] = true;
d[now][1] = 1;
for (int next: p[now]) {
if (chk[next]) continue;
go(next);
d[now][0] += d[next][1];
d[now][1] += min(d[next][0], d[next][1]);
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
p.resize(n + 1);
for (int i = 0; i < n - 1; i++) {
int u, v;
cin >> u >> v;
p[u].push_back(v);
p[v].push_back(u);
}
go(1);
cout << min(d[1][0], d[1][1]);
}
728x90
'알고리즘 > 문제 풀이' 카테고리의 다른 글
[BOJ] 백준 14226 이모티콘 (0) | 2021.03.09 |
---|---|
[프로그래머스] 지형 이동 (Summer/Winter Coding 2019) (0) | 2021.03.09 |
[BOJ] 백준 10775 공항 (0) | 2021.03.09 |
[BOJ] 백준 9527 1의 개수 세기 (5) | 2021.03.09 |
[BOJ] 백준 9466 텀 프로젝트 (2) | 2021.03.08 |
댓글