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

[BOJ] 10037 : Decorating the Pastures

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

10037๋ฒˆ: Decorating the Pastures (acmicpc.net)

 

10037๋ฒˆ: Decorating the Pastures

Farmer John has N (1 <= N <= 50,000) pastures, conveniently numbered 1...N, connected by M (1 <= M <= 100,000) bidirectional paths. Path i connects pasture A_i (1 <= A_i <= N) to pasture B_i (1 <= B_i <= N) with A_i != B_i. It is possible for two paths to

www.acmicpc.net

๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ๋ฌธ์ œ.

๋ฌธ์ œ ํ•ด์„

๋†๋ถ€ ์กด์€ N๊ฐœ์˜ ๋ชฉ์žฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ๋†์žฅ์€ M๊ฐœ์˜ ๊ธธ๋กœ ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋†์žฅ๋ผ๋ฆฌ๋Š” ์ตœ๋Œ€ 2๊ฐœ์˜ ๊ธธ๋กœ ์—ฐ๊ฒฐ๋  ์ˆ˜๋„ ์žˆ๋‹ค. ๋ฒ ์‹œ๊ฐ€ ์กด์˜ ์ƒ์ผ์„ ์ถ•ํ•˜ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด ๊ฐ ๋†์žฅ์„ ๊พธ๋ฏธ๋ ค๊ณ  ํ•œ๋‹ค. F ๋˜๋Š” J๋กœ ๊พธ๋ฐ€ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋Š” ๋†์žฅ๋ผ๋ฆฌ๋Š” ์„œ๋กœ ๊ฐ™์€ ์•ŒํŒŒ๋ฒณ์œผ๋กœ ๊พธ๋ฐ€ ์ˆ˜ ์—†๋‹ค. ๊ทธ๋Ÿฐ๋ฐ F๋ณด๋‹ค J๋กœ ๊พธ๋ฏธ๋Š”๊ฒŒ ๋” ์‹ธ๊ธฐ ๋•Œ๋ฌธ์— ์ตœ๋Œ€ํ•œ J๋ฅผ ๋งŽ์ด ์ด์šฉํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๋งŒ์•ฝ ์กฐ๊ฑด์„ ์ง€ํ‚ค๋ฉด์„œ ๋ชจ๋“  ๋†์žฅ์„ ๊พธ๋ฐ€ ์ˆ˜ ์—†๋‹ค๋ฉด -1์„ ์ถœ๋ ฅํ•˜๊ณ , ๊พธ๋ฐ€ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ตœ๋Œ€ J์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•ด๋ผ.

ํ’€์ด

๋‹จ์ˆœํ•œ BFS ๋ฌธ์ œ ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ J๋ฅผ ์ตœ๋Œ€ํ•œ ๋งŽ์ด ์ด์šฉํ•˜๋ผ๋Š” ์กฐ๊ฑด์ด ์žˆ๋‹ค. ๋งŒ์•ฝ ์ด์›ƒ ๋†์žฅ๊ณผ ์—ฐ๊ฒฐ๋œ ๊ธธ์ด ํ•˜๋‚˜๋„ ์—†๋Š” ๋†์žฅ์ด๋ผ๋ฉด ๊ทธ๋ƒฅ J๋กœ ๊พธ๋ฏธ๋ฉด ๋œ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ ๋†์žฅ์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ์ƒํ™ฉ์ด๋ผ๋ฉด ์ฒ˜์Œ์— ๋จผ์ € J๋กœ ๊พธ๋ฏธ๋Š”๊ฒŒ ์ด๋“์ธ์ง€ F๋กœ ๊พธ๋ฏธ๋Š”๊ฒŒ ์ด๋“์ธ์ง€ ๋ฐ”๋กœ ํŒ๋‹จํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค.

๋‚˜๋Š” J์™€ F๋ฅผ ์ˆซ์ž๋กœ ํ‘œ๊ธฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋‹จ์ˆœํžˆ J๋Š” 2๋กœ F๋Š” 3์œผ๋กœ ํ‘œ๊ธฐํ–ˆ๋‹ค(์ด์œ  ์—†์Œ). ๊ทธ๋ž˜์„œ visited ๋ฐฐ์—ด์„ ๋งŒ๋“  ํ›„ ํ•ด๋‹น ๋†์žฅ์˜ ๊ฐ’์ด 0์ด๋ฉด ์•„์ง ๊พธ๋ฉฐ์ง€์ง€์•Š์€ ๋†์žฅ, 2๋ฉด J๋กœ ๊พธ๋ฉฐ์ง„ ๋†์žฅ, 3์ด๋ฉด F๋กœ ๊พธ๋ฉฐ์ง„ ๋†์žฅ์œผ๋กœ ํ‘œ๊ธฐํ–ˆ๋‹ค.

1 ~ N ๊นŒ์ง€ ๋Œ๋ฉด์„œ ํ•ด๋‹น ๋†์žฅ์ด ์•„์ง ๊พธ๋ฉฐ์ง€์ง€ ์•Š์•˜์œผ๋ฉด BFS๋ฅผ ํ†ตํ•ด์„œ ์ธ์ ‘ํ•œ ๋†์žฅ์„ ๊ฒน์น˜์ง€ ์•Š๊ฒŒ ๊พธ๋ฉฐ์ฃผ์—ˆ๋‹ค. ์ฒ˜์Œ ์‹œ์ž‘์ ์„ J๋กœ ๊พธ๋ฐ€์ง€ F๋กœ ๊พธ๋ฐ€์ง€ ๋ชจ๋ฅด๋ฏ€๋กœ ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ ๋ชจ๋‘ ํ•ด๋ณด์•˜๋‹ค. ํƒ์ƒ‰ ๋„์ค‘์— ์ธ์ ‘ํ•œ ๋‘ ์นธ์ด ๋˜‘๊ฐ™์€ ์•ŒํŒŒ๋ฒณ์œผ๋กœ ๊พธ๋ฉฐ์ง€๋ฉด ๊ทธ๋•Œ๋Š” ์ž˜๋ชป๋œ ๊ฒฝ์šฐ์ด๋ฏ€๋กœ ํƒ์ƒ‰์„ ์ค‘๋‹จํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  J๋กœ ์‹œ์ž‘ํ•œ ๊ฒฝ์šฐ F๋กœ ์‹œ์ž‘ํ•œ ๊ฒฝ์šฐ ๋ชจ๋‘ ์œ ํšจํ•œ ๊ฒฝ์šฐ, ์ฆ‰ ๋ชจ๋“  ์—ฐ๊ฒฐ๋œ ๋†์žฅ์ด ๋‹ค๋ฅธ ์•ŒํŒŒ๋ฒณ์œผ๋กœ ๊พธ๋ฉฐ์ง„ ๊ฒฝ์šฐ ๋‘˜ ์ค‘์— J๋ฅผ ๋” ๋งŽ์ด ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ๋ฅผ ํƒํ–ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊พธ๋ฏธ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๋Š” ๊ฒฝ์šฐ์ด๋ฏ€๋กœ -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#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 998244353
using namespace std;
typedef long long ll;
typedef priority_queue<pair<ll, pair<intint>>vector<pair<ll, pair<intint>>>, greater<pair<ll, pair<intint>>>> Priority_queue;
const ll INF = LLONG_MAX;
const int MAX_N = 50000 + 5;
vector<int> visited(MAX_N,0);
vector<int> visited_1(MAX_N,0);
vector<int> visited_2(MAX_N,0);
vector<int> Edge[MAX_N];
int N, M;
 
int Fill_pasture(int st, int letter) {
    queue<pair<intint>> q;
    q.push({ st,letter });
    if (letter == 2) {
        int cnt = 0;
        while (!q.empty()) {
            int now = q.front().first;
            int Letter = q.front().second;
            q.pop();
            if (visited_1[now] == Letter)
                continue;
            else if (visited[now] != 0 && visited[now] != Letter)
                return -1;
            visited_1[now] = Letter;
            if (Letter == 2)
                cnt++;
            for (int i = 0; i < Edge[now].size(); i++) {
                int next = Edge[now][i];
                int next_letter;
                if (Letter == 2)
                    next_letter = 3;
                else next_letter = 2;
                if (!visited_1[next])
                    q.push({ next,next_letter });
                else if (visited_1[next] != next_letter)
                    return -1;
            }
        }
        return cnt;
    }
    else if (letter == 3) {
        int cnt = 0;
        while (!q.empty()) {
            int now = q.front().first;
            int Letter = q.front().second;
            q.pop();
            if (visited_2[now] == Letter)
                continue;
            else if (visited[now] != 0 && visited[now] != Letter)
                return -1;
            visited_2[now] = Letter;
            if (Letter == 2)
                cnt++;
            for (int i = 0; i < Edge[now].size(); i++) {
                int next = Edge[now][i];
                int next_letter;
                if (Letter == 2)
                    next_letter = 3;
                else next_letter = 2;
                if (!visited_2[next])
                    q.push({ next,next_letter });
                else if (visited_2[next] != next_letter)
                    return -1;
            }
        }
        return cnt;
    }
}
 
int main(void) {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> N >> M;
    for (int i = 0; i < M; i++) {
        int a, b;
        cin >> a >> b;
        Edge[a].push_back(b);
        Edge[b].push_back(a);
    }
 
    for (int i = 1; i <= N; i++) {
        if (visited[i] != 0)
            continue;
        visited_1 = visited;
        visited_2 = visited;
        int cnt_1 = Fill_pasture(i, 2);
        int cnt_2 = Fill_pasture(i, 3);
        if (cnt_1 == -1 && cnt_2 == -1) {
            cout << "-1\n";
            return 0;
        }
        else if (cnt_1 >= cnt_2) {
            visited = visited_1;
        }
        else if (cnt_2 > cnt_1) {
            visited = visited_2;
        }
    }
    int ans = 0;
    for (int i = 1; i <= N; i++) {
        if (visited[i] == 2)
            ans++;
    }
    cout << ans << "\n";
    return 0;
}
cs

728x90

'๋ฐฑ์ค€ > Gold' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[BOJ] 9879 : Cross Country Skiing  (1) 2022.05.03
[BOJ] 14529 : Where's Bessie?  (0) 2022.04.29
[BOJ] 13595 : Mania de Par  (0) 2022.04.27
[BOJ] 5901 : Relocation  (0) 2022.04.25
[BOJ] 9874 : Wormholes  (0) 2022.04.22