지우너
[코드트리] 노드 최적의 개수2 C++ 본문
문제
https://www.codetree.ai/missions/9/problems/node-best-count-2?&utm_source=clipboard&utm_medium=text
코드트리 | 코딩테스트 준비를 위한 알고리즘 정석
국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.
www.codetree.ai
코드
트리 위에 물건 놓기 문제와 비슷했다.
#include <iostream>
#include <vector>
using namespace std;
const int MAX_N =100001;
int n, m;
vector<int> edges[MAX_N];
bool visited[MAX_N]={false, };
bool isPlaced[MAX_N]={false, };
int dp[MAX_N][2];
void DFS(int x){
if(!isPlaced[x]) dp[x][0]=0, dp[x][1]=1;
for(int y : edges[x]){
if(visited[y]) continue;
visited[y]=true;
DFS(y);
// y에 놓여있으면 x에는 놓든 말든 상관없음
// 아니라면 둘 중 하나에는 놓아야 한다
dp[x][0]+=dp[y][1];
dp[x][1]+=min(dp[y][0], dp[y][1]);
}
}
int main() {
// input
cin >> n >> m;
for(int i=1; i<n; ++i){
int a, b;
cin >> a >> b;
edges[a].push_back(b);
edges[b].push_back(a);
}
for(int i=0; i<m; ++i){
int node;
cin >> node;
isPlaced[node]=true;
}
// solution
visited[1]=true;
DFS(1);
// output
cout << min(dp[1][0], dp[1][1]) << '\n';
return 0;
}
'Problem Solving' 카테고리의 다른 글
[코드트리] 트리 경로 길이 C++ (0) | 2024.10.18 |
---|---|
[코드트리] 노드의 공통 조상 2 C++ (0) | 2024.10.17 |
[코드트리] 인접한 노드2 C++ (0) | 2024.10.14 |
[코드트리] 인접한 정점 C++ (0) | 2024.10.13 |
[코드트리] 노드의 값 C++ (0) | 2024.10.12 |