๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๋ฐฑ์ค€/Gold

[BOJ] 2533 : ์‚ฌํšŒ๋ง ์„œ๋น„์Šค(SNS)

by Jaeguk 2022. 4. 5.
๋ฌธ์ œ ๋งํฌ

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<intpair<intint>>vector<pair<intpair<intint>>>, greater<pair<intpair<intint>>>> 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 ์‚ฌ์ด์— ์žˆ๋Š” ์•„๋ฌด ๋…ธ๋“œ๋ฅผ ๋ฃจํŠธ๋…ธ๋“œ๋กœ ๋ด๋„ ์ƒ๊ด€์€ ์—†๋‹ค.

=> ๊ทธ๋ฆฌ๊ณ  ๋ฃจํŠธ๊ฐ€ ์ •ํ•ด์ ธ์žˆ์ง€ ์•Š๊ธฐ๋•Œ๋ฌธ์— ์—ฃ์ง€๋ฅผ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ์„ค์ •ํ•ด์•ผํ•œ๋‹ค.

728x90