티스토리 뷰
https://www.acmicpc.net/problem/17493
보통 저런 문제들이 트리 dp형태인데, dp테이블을 직관적으로 세워보자.
\(dp[i][0] : \) \(i\)번 노드가 루트인 서브트리에서 \(i\)번 노드는 자식들 중 한 노드에 전단지가 붙여져있을 때, 최소 전단지 수
\(dp[i][1] : \) \(i\)번 노드가 루트인 서브트리에서 \(i\)번 노드에 전단지를 붙일때, 최소 전단지 수
\(dp[i][2] : \) \(i\)번 노드가 루트인 서브트리에서 \(i\)번 노드의 부모가 전단지가 붙여져있을 때, 최소 전단지 수
이렇게 \(dp\)식을 세우면 쉽게 풀린다.
#include <bits/stdc++.h>
#define x first
#define y second
#define pb push_back
#define all(v) v.begin(),v.end()
#pragma gcc optimize("O3")
#pragma gcc optimize("Ofast")
#pragma gcc optimize("unroll-loops")
using namespace std;
const int INF = 1e9;
const int TMX = 1 << 18;
const long long llINF = 1e16;
const long long mod = 1e9+7;
const long long hashmod = 100003;
const int MAXN = 100000;
const int MAXM = 1000000;
typedef long long ll;
typedef long double ld;
typedef pair <int,int> pi;
typedef pair <ll,ll> pl;
typedef vector <int> vec;
typedef vector <pi> vecpi;
typedef long long ll;
int n,m,c[200005];
ll d[200005][3];
vec v[200005];
/*
d[i][j] : i노드에서 j인 경우에서 최소 개수
j=0 : 자식 중 한명이 전단지
j=1 : 내 자신이 전단지
j=2 : 부모가 전단지
d[i][0] = d[v][1]+SUM( min(d[j][0],d[j][1]) ) ;
d[i][1] += min(d[j][0],d[j][1],d[j][2]);
d[i][2] += min(d[j][0],d[j][1]);
*/
void go(int x,int pr) {
c[x] = 1;
ll sum = 0;
for(int i : v[x]) {
if(i == pr) continue;
go(i,x);
d[x][1] += min({d[i][0],d[i][1],d[i][2]});
d[x][2] += min({d[i][0],d[i][1]});
sum += min({d[i][0],d[i][1]});
}
d[x][0] = INF;
d[x][1]++;
for(int i : v[x]) {
if(i == pr) continue;
d[x][0] = min(d[x][0],sum-min(d[i][0],d[i][1])+d[i][1]);
}
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(0);
cin >> n >> m;
for(int i = 1;i <= m;i++) {
int x,y; cin >> x >> y;
v[x].pb(y), v[y].pb(x);
}
int ans = 0;
for(int i = 1;i <= n;i++) {
if(c[i]) continue;
go(i,-1);
ans += min(d[i][0],d[i][1]);
}
cout << ans;
}
'BOJ' 카테고리의 다른 글
[BOJ] 2601 도서실카펫 (0) | 2022.04.09 |
---|---|
[BOJ] 16496 큰 수 만들기 (0) | 2021.08.15 |
[BOJ] 8146 Tetris Attack (0) | 2021.08.08 |
[BOJ] 6461 Hotel (0) | 2021.08.07 |
[BOJ] 18919 Allowed Swaps (0) | 2021.08.05 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- PS
- 앳코더
- AtCoder
- Rabin-Karp
- 쿼리
- 비요뜨 존맛
- 냄새 싫어
- 오일러 경로
- 스택
- 알고리즘 문제 풀이
- ABC
- 하이퍼
- 세그먼트 트리
- 누적 합
- hyper
- codeforces
- gunwookim
- DP
- 김춘배
- 간단한 풀이
- combination
- BOJ
- Constructive
- Offline Dynamic Connectivity
- 1909
- 비요뜨
- 정렬
- 수열과 쿼리
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함