๐Ÿ’ป coding/baekjoon

[baekjoon/C++] ๋ฐฑ์ค€ 1043_๊ฑฐ์ง“๋ง

๊ธฐ๋ฎจ์ง€ 2021. 7. 11. 18:15

 

 

๋ฐฑ์ค€ 1043

๋‚œ์ด๋„ ; Gold 4

๋ฌธ์ œ ๋งํฌ ; https://www.acmicpc.net/problem/1043

 

 

1043๋ฒˆ: ๊ฑฐ์ง“๋ง

์ง€๋ฏผ์ด๋Š” ํŒŒํ‹ฐ์— ๊ฐ€์„œ ์ด์•ผ๊ธฐ ํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•œ๋‹ค. ํŒŒํ‹ฐ์— ๊ฐˆ ๋•Œ๋งˆ๋‹ค, ์ง€๋ฏผ์ด๋Š” ์ง€๋ฏผ์ด๊ฐ€ ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ์ด์•ผ๊ธฐ๋ฅผ ํ•œ๋‹ค. ์ง€๋ฏผ์ด๋Š” ๊ทธ ์ด์•ผ๊ธฐ๋ฅผ ๋งํ•  ๋•Œ, ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ์ง„์‹ค๋กœ ๋งํ•˜๊ฑฐ๋‚˜ ์—„์ฒญ๋‚˜๊ฒŒ

www.acmicpc.net

 

 

ํ’€์ด/์‚ฌ๊ณ  ๊ณผ์ •

 

์ง€๋ฏผ์ด๊ฐ€ ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ๋“ค์„ ํ”ผํ•ด ํŒŒํ‹ฐ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๊ฑฐ์ง“๋ง์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋ฌธ์ œ.

๋ฌธ์ œ ํ•ด๊ฒฐ์— ์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ "์–ด๋–ค ์‚ฌ๋žŒ์ด ์–ด๋–ค ํŒŒํ‹ฐ์—์„œ๋Š” ์ง„์‹ค์„ ๋“ฃ๊ณ ,

๋˜ ๋‹ค๋ฅธ ํŒŒํ‹ฐ์—์„œ๋Š” ๊ณผ์žฅ๋œ ์ด์•ผ๊ธฐ๋ฅผ ๋“ค์—ˆ์„ ๋•Œ๋„ ์ง€๋ฏผ์ด๋Š” ๊ฑฐ์ง“๋ง์Ÿ์ด๋กœ ์•Œ๋ ค์ง€๊ฒŒ ๋œ๋‹ค."์˜€๋‹ค.

ํŒŒํ‹ฐ์— ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ์ด ์žˆ๋‹ค๋ฉด, ๊ทธ ํŒŒํ‹ฐ์— ์žˆ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์ฐธ์„ํ•˜๋Š” ๋‹ค๋ฅธ ํŒŒํ‹ฐ์—์„œ๋„ ์ง€๋ฏผ์ด๋Š” ์ง„์‹ค๋งŒ ๋งํ•ด์•ผ ํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ๊ฐ ํŒŒํ‹ฐ์— ์ฐธ์„ํ•œ ์‚ฌ๋žŒ๋“ค์„ ๊ฐ™์€ ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ๊ณ , ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ๊ณผ ๊ฐ™์€ ๊ทธ๋ฃน์ด๋ผ๋ฉด

์ง€๋ฏผ์ด๊ฐ€ ๊ฑฐ์ง“๋ง์„ ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์ ์„ ํ†ตํ•ด ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด ๋œ๋‹ค.

 

์ฒ˜์Œ์— ๊ทธ๋ž˜ํ”„๊ฐ€ ๋– ์˜ค๋ฅด๊ธด ํ–ˆ์ง€๋งŒ, ์•Œ๊ณ  ์žˆ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค ์ค‘์—์„œ๋Š” ๋งˆ๋•…ํžˆ ์ด๊ฑฐ ์จ์•ผ๊ฒ ๋‹ค ํ•˜๋Š” ๊ฒŒ ์—†์–ด์„œ ๊ตฌ๊ธ€๋ง์„ ํ•ด๋ดค๋‹ค.

ํŠธ๋ฆฌ&๊ทธ๋ž˜ํ”„ ๋ถ€๋ถ„ ์ง„๋„ ๋‚˜๊ฐ€๋˜ ์ค‘์ผ ๋•Œ ์ž๋ฃŒ๊ตฌ์กฐ ์žฌ์ˆ˜๊ฐ•ํ•˜๋ ค๊ณ  ๋งˆ์Œ๋จน๊ณ  ๊ณต๋ถ€ ์•ˆ ํ–ˆ๋”๋‹ˆ ๋ฐฑ์ค€ ๋ฌธ์ œ ํ’€ ๋•Œ ๊ฑธ๋ฆฌ๋Š” ๋ถ€๋ถ„์ด ๋งŽ์•„์„œ ์–ผ๋ฅธ ํ˜ผ์ž์„œ๋ผ๋„ ๋‹ค์‹œ ๊ณต๋ถ€ํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค.ใ…Ž

 

์ด ๋ฌธ์ œ์—์„œ๋Š” Union-Find ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์‚ฌ์šฉ๋๋‹ค.

์šฐ์„ , ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ๋“ค์„ ์ž…๋ ฅ๋ฐ›์•„ ๋ฒกํ„ฐ์— ์ €์žฅํ•œ๋‹ค.

๊ทธ๋‹ค์Œ์—๋Š” ๊ฐ ํŒŒํ‹ฐ์— ์ฐธ์„ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ๊ฐ™์€ ๊ทธ๋ž˜ํ”„๋กœ ๋ฌถ๋Š”๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํŒŒํ‹ฐ์— ์˜จ ์‚ฌ๋žŒ๋“ค๊ณผ ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ์ด ๊ฐ™์€ ๊ทธ๋ž˜ํ”„์— ์†ํ•ด์žˆ๋‹ค๋ฉด(๊ฐ™์€ root ๋…ธ๋“œ๋ผ๋ฉด),

๊ฑฐ์ง“๋ง์„ ํ•  ์ˆ˜ ์žˆ๋Š” ํŒŒํ‹ฐ์˜ ์ˆ˜(M)๋ฅผ ์ค„์ธ๋‹ค.

 

 

์ฝ”๋“œ

 

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <iostream>
#include <vector>
 
using namespace std;
 
int parents[51];
vector <int> know;
vector <vector<int>> party(50);
 
int Find(int x) {
    if (parents[x] == x) return x; //x์˜ ๋ถ€๋ชจ๊ฐ€ x์™€ ๊ฐ™์€ ๊ฒฝ์šฐ, ์ž๊ธฐ ์ž์‹  return
    return x = Find(parents[x]); //๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์ฐพ์„ ๋•Œ๊นŒ์ง€ ์žฌ๊ท€์ ์œผ๋กœ ํƒ์ƒ‰
}
 
void Union(int a, int b) {
    a = Find(a);
    b = Find(b);
    parents[a] = b;
}
 
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
 
    int N, M, K;
 
    cin >> N >> M >> K; //K = ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ์˜ ์ˆ˜
 
    while (K--) {
        int truth; //์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ์˜ ๋ฒˆํ˜ธ
        cin >> truth;
        know.push_back(truth); //์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ์˜ ๋ฒˆํ˜ธ๋ฅผ know ๋ฒกํ„ฐ์— push
    }
 
    for (int i = 1; i <= N; i++) { //๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ์ž๊ธฐ ์ž์‹ ์„ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ์ดˆ๊ธฐํ™”
        parents[i] = i;
    }
 
    for (int i = 0; i < M; i++) {
        int num, prev, member;
        cin >> num; //ํŒŒํ‹ฐ์— ์˜ค๋Š” ์‚ฌ๋žŒ ์ˆ˜
 
 
        for (int j = 0; j < num; j++) {
            if (j < 1) {
                cin >> member;
            }
            else {
                prev = member;
                cin >> member;
                Union(prev, member); //ํŒŒํ‹ฐ์— ์˜จ ์‚ฌ๋žŒ ๊ทธ๋ฃนํ™”ํ•˜๊ธฐ
            }
            party[i].push_back(member); //i๋ฒˆ์งธ ํŒŒํ‹ฐ์— ์˜จ ์‚ฌ๋žŒ๋“ค์„ ๊ทธ๋ฃน์œผ๋กœ ์ €์žฅ
        }
    }
 
    for (auto& list : party) {
        bool flag = false;
        for (auto& person : list) { //ํŒŒํ‹ฐ์— ๊ฐ„ ์‚ฌ๋žŒ๋“ค
            if (flag) break;
            for (auto& truth : know) { //์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ๋“ค
                if (Find(person) == Find(truth)) { //ํŒŒํ‹ฐ์— ๊ฐ„ ์‚ฌ๋žŒ์ด ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ๊ณผ ๊ฐ™์€ ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด
                    flag = true//flag๋Š” truth
                    break;
                }
            }
        }
        if (flag) M--//flag๊ฐ€ truth์ธ ๊ฒฝ์šฐ ๊ฑฐ์ง“๋ง์„ ํ•  ์ˆ˜ ์žˆ๋Š” ํŒŒํ‹ฐ ์ˆ˜ ํ•˜๋‚˜ ๊ฐ์†Œ
    }
    cout << M;
 
    return 0;
}
cs

 

์ง€์ /๋Œ“๊ธ€ ์–ธ์ œ๋‚˜ ํ™˜์˜