๋ฌธ์ ๋งํฌ
2533๋ฒ: ์ฌํ๋ง ์๋น์ค(SNS) (acmicpc.net)
2533๋ฒ: ์ฌํ๋ง ์๋น์ค(SNS)
์ฒซ ๋ฒ์งธ ์ค์๋ ์น๊ตฌ ๊ด๊ณ ํธ๋ฆฌ์ ์ ์ ๊ฐ์ N์ด ์ฃผ์ด์ง๋ค. ๋จ, 2 ≤ N ≤ 1,000,000์ด๋ฉฐ, ๊ฐ ์ ์ ์ 1๋ถํฐ N๊น์ง ์ผ๋ จ๋ฒํธ๋ก ํํ๋๋ค. ๋ ๋ฒ์งธ ์ค๋ถํฐ N-1๊ฐ์ ์ค์๋ ๊ฐ ์ค๋ง๋ค ์น๊ตฌ ๊ด๊ณ ํธ๋ฆฌ์ ์
www.acmicpc.net
ํธ๋ฆฌ๋ก ์ด๋ฃจ์ด์ง ์ฌํ๊ด๊ณ๋ง์์ ๋ชจ๋๊ฐ ์๋ก์ด ๊ฒ์ ๋ฐ์๋ค์ด๊ธฐ ์ํด ํ์ํ ์ต์ ์ผ๋ฆฌ์ด๋ตํฐ ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ .
ํ์ด
๊ธฐ์กด์ DP๋ฌธ์ ์๋ ๋ค๋ฅด๊ฒ ํธ๋ฆฌ์ DP๊ฐ ํฉ์ณ์ง ๋ฌธ์ .
ํ๋์ ์ ์ ์ ๋ํด์ ์ฐ๋ฆฌ๋ 2๊ฐ์ง ๊ฒฝ์ฐ๋ก ๋๋ ์ ๋ณผ ์ ์๋ค. ํด๋น ์ ์ ์ด ์ผ๋ฆฌ์ด๋ตํฐ์ด๊ฑฐ๋ ์ผ๋ฆฌ์ด๋ตํฐ๊ฐ ์๋๊ฑฐ๋.
0์ ์ผ๋ฆฌ์ด๋ตํฐ์ธ ๊ฒฝ์ฐ, 1์ ์ผ๋ฆฌ์ด๋ตํฐ๊ฐ ์๋๊ฒฝ์ฐ๋ก ์๊ฐํ๊ณ DP๋ฐฐ์ด์ 2์ฐจ์์ผ๋ก ๋๋ด๋ค.
DP[i][0] ๊ณผ DP[i][1].
DP[i][0]์๋ ์ ์ i๊ฐ ์ผ๋ฆฌ์ด๋ตํฐ์ธ ๊ฒฝ์ฐ์ ํ์ํ ์ผ๋ฆฌ์ด๋ตํฐ์ ์ต์ ์๋ฅผ ์ ์ฅํ๊ณ
DP[i][1]์๋ ๋ฐ๋๋ก ์ ์ i๊ฐ ์ผ๋ฆฌ์ด๋ตํฐ๊ฐ ์๋ ๊ฒฝ์ฐ์ ํ์ํ ์ผ๋ฆฌ์ด๋ตํฐ์ ์ต์ ์๋ฅผ ์ ์ฅํ๋ค.
์ ์ i์ ์์์ ์์๋ ธ๋๋ฅผ child ๋ผ๊ณ ํ๋ค๋ฉด, i๊ฐ ์ผ๋ฆฌ์ด๋ตํฐ์ธ ๊ฒฝ์ฐ์๋ child๊ฐ ์ผ๋ฆฌ์ด๋ตํฐ์ด๋ ์๋๋ ์๊ด์๋ค.
DP[i][0] += min(DP[child][0], DP[child][1])
i๊ฐ ์ผ๋ฆฌ์ด๋ตํฐ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ child๊ฐ ๋ชจ๋ ์ผ๋ฆฌ์ด๋ตํฐ์ฌ์ผ๋ง ํ๋ค.
DP[i][1] += DP[child][0]
์ด ์ ํ์์ ์ ์ i์ ๋ชจ๋ ์์๋ ธ๋์ ๋ํด ์คํํด์ฃผ๋ฉด ๋๋ค.
์ฌ๊ธฐ์ ์ ํ์์ Bottom-up ๋ฐฉ์์ผ๋ก ์ฑ์์ ธ์ผํ๋ค. ์ตํ์ ๋ ธ๋(?) ์ฆ, ๋ฆฌํ๋ ธ๋๋ถํฐ ๊ฐ์ ์ฑ์๋๊ฐ์ผ ํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ฌ๊ท๋ฅผ ์ด์ฉํด์ ๊ฐ์ฅ ๊น์๊ณณ๊น์ง ๋ด๋ ค๊ฐ์ DP๋ฐฐ์ด์ ์ฑ์๋๊ฐ๋ค.
ํ ๋ฒ ๋ฐฉ๋ฌธํ ๋ ธ๋๋ ์ฌ๋ฐฉ๋ฌธํ ํ์๊ฐ ์์ผ๋ฏ๋ก visited ๋ฐฐ์ด์ ์ด์ฉํด์ ์ค๋ณต์ ๋ฐฉ์งํ๋ค.
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
|
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <string.h>
#include <string>
#include <stack>
#include <vector>
#include <math.h>
#include <queue>
#include <climits>
#include <algorithm>
#include <iomanip>
#include <map>
#define mod 1000000007
using namespace std;
typedef long long ll;
typedef priority_queue<pair<int, pair<int, int>>, vector<pair<int, pair<int, int>>>, greater<pair<int, pair<int, int>>>> Priority_queue;
const int INF = INT_MAX;
const int MAX_N = 1000000 + 5;
int N;
vector<int> Child[MAX_N];
int DP[MAX_N][2]; //0์ ์ผ๋ฆฌ์ด๋ตํฐ ์ผ๋, 1์ ์๋๋
bool visited[MAX_N];
void travel(int now) {
visited[now] = true;
DP[now][0] = 1;
for (int i = 0; i < Child[now].size(); i++) {
int child = Child[now][i];
if (visited[child])
continue;
travel(child);
DP[now][0] += min(DP[child][0], DP[child][1]);
DP[now][1] += DP[child][0];
}
}
int main(void) {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> N;
for (int i = 0; i < N - 1; i++) {
int P, C;
cin >> P >> C;
Child[P].push_back(C);
Child[C].push_back(P);
}
travel(1);
cout << min(DP[1][1], DP[1][0]) << "\n";
return 0;
}
|
cs |
์ ์์์ ์ 1๋ก ์ง์ ํ๋๋. ์ฌ์ค ์ด ๋ฌธ์ ์์ ๋ฃจํธ๋ฅผ ์ง์ ํด์ฃผ์ง ์์๊ธฐ ๋๋ฌธ์ ๋ฃจํธ๋ ธ๋๋ฅผ ์ด๋ค ์ ์ ์ผ๋ก ๋ด๋ ์๊ด์๋ค. ๊ทธ๋์ ๋๋ ํธ์์ 1์ ๋ฃ์ด์ค ๊ฒ์ด๋ค. ํ์ง๋ง 1์ ๋ฃ์๋ค๋ ๊ฒ์ ๋ฃจํธ๋ ธ๋๋ฅผ 1๋ก ๋ณด๊ฒ ๋ค๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ง์ง๋ง์ DP[1][1]๊ณผ DP[1][0]์ ๋น๊ตํด์ ์์ ๊ฐ์ ์ถ๋ ฅํด์ค๋ค. 1~N ์ฌ์ด์ ์๋ ์๋ฌด ๋ ธ๋๋ฅผ ๋ฃจํธ๋ ธ๋๋ก ๋ด๋ ์๊ด์ ์๋ค.
=> ๊ทธ๋ฆฌ๊ณ ๋ฃจํธ๊ฐ ์ ํด์ ธ์์ง ์๊ธฐ๋๋ฌธ์ ์ฃ์ง๋ฅผ ์๋ฐฉํฅ์ผ๋ก ์ค์ ํด์ผํ๋ค.
'๋ฐฑ์ค > Gold' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] 18858 : ํ๋ จ์๋ก ๊ฐ๋ ๋ (0) | 2022.04.06 |
---|---|
[BOJ] 5582 : ๊ณตํต ๋ถ๋ถ ๋ฌธ์์ด (0) | 2022.04.05 |
[BOJ] 1915 : ๊ฐ์ฅ ํฐ ์ ์ฌ๊ฐํ (0) | 2022.04.04 |
[BOJ] 24888 : ๋ ธํธ ์กฐ๊ฐ (0) | 2022.03.31 |
[BOJ] 24887 : ์ต๋ํ์ ํด์ (0) | 2022.03.30 |