๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm ๐Ÿง‘๐Ÿป‍๐Ÿ’ป/๋ฐฑ์ค€(BOJ)

[๋ฐฑ์ค€,c++] 20955๋ฒˆ - ๋ฏผ์„œ์˜ ์‘๊ธ‰ ์ˆ˜์ˆ 

by ์•ˆ์ฃผํ˜• 2022. 8. 23.

๋ฌธ์ œ

 

20955๋ฒˆ: ๋ฏผ์„œ์˜ ์‘๊ธ‰ ์ˆ˜์ˆ 

๋ฏผ์„œ๋Š” ๊ฐ•์›๋Œ€ํ•™๊ต ์ปดํ“จํ„ฐ๊ณตํ•™๊ณผ์˜ ์‹ ์ž„ ๊ต์ˆ˜์ด๋‹ค. ๊ทธ๋…€๊ฐ€ ์ €์ˆ ํ•œ ํšจ์œจ์ ์ธ ํƒ๋ฐฐ ๋ฐฐ๋‹ฌ์„ ์œ„ํ•œ ์ตœ์  ๊ฒฝ๋กœ ์„ค๊ณ„์— ๊ด€ํ•œ ์—ฐ๊ตฌ ๋…ผ๋ฌธ์€ ์•„์ง๋„ ๋„๋ฆฌ ์ธ์šฉ๋˜๊ณ  ์žˆ๋‹ค. ์˜ค๋Š˜๋„ ์—ด์‹ฌํžˆ ๊ฐ•์˜๋ฅผ ํ•˜๋˜ ๋ฏผ์„œ

www.acmicpc.net

 

์ฝ”๋“œ

#include <iostream>
#define MAX 100001
using namespace std;

int N, M, ans;
int parent[MAX];

int find_parent(int a){
    if(a == parent[a]) return a;
    return parent[a] = find_parent(parent[a]);
}

void make_parent(int a, int b){
    a = find_parent(a);
    b = find_parent(b);
    if(a<b) parent[b] = a;
    else parent[a] = b;
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin>>N>>M;
    
    for(int i=0; i<MAX; i++) parent[i] = i;
    
    for(int i=0; i<M; i++){
        int a, b; cin>>a>>b;
        if(find_parent(a) != find_parent(b)){
            make_parent(a,b);
        }
        else ans++; // ๋ถ€๋ชจ๊ฐ€ ๊ฐ™์€ ๊ฒฝ์šฐ(์‚ฌ์ดํด์ด ์ƒ๊น€) - ๋–ผ์–ด๋‚ด์•ผ ํ•œ๋‹ค.
    }
    
    for(int i=1; i<=N; i++){  // ๋ถ€๋ชจ๊ฐ€ ์ž๊ธฐ ์ž์‹ ์ธ ๊ฒฝ์šฐ - ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์•ผ ํ•œ๋‹ค.
        if(i == find_parent(i)) ans++;
    }
    
    
    cout<<ans-1; // ๋ฐ”๋กœ ์œ„์—์„œ ๋ฃจํŠธ ๋…ธ๋“œ๋„ ํ•ฉ์นœ๊ฒฝ์šฐ๋ฅผ ๋นผ์ค€๋‹ค.
}

 

ํ’€์ด

์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ๋กœ ํ’€์ด๊ฐ€ ๊ฐ€๋Šฅํ•œ ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค. 

  • ์ดˆ๊ธฐ์— ๋ชจ๋“  ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๋Š” ์ž๊ธฐ ์ž์‹ ์œผ๋กœ ์„ธํŒ…ํ•ฉ๋‹ˆ๋‹ค.
  • ์ž…๋ ฅ์„ ๋ฐ›์„ ๋•Œ ๋‘ ๋…ธ๋“œ๊ฐ€ ๊ฐ™์€ ๋ถ€๋ชจ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ๋ฅผ ํ†ตํ•ด ๋ถ€๋ชจ๋ฅผ ํ•ฉ์ณ์ฃผ๊ณ , ๋ถ€๋ชจ๊ฐ€ ๊ฐ™๋‹ค๋ฉด ๋–ผ์–ด๋‚ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํšŸ์ˆ˜๋ฅผ ์ฆ๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค.
  • ๊ทธ ํ›„, ๋ถ€๋ชจ๊ฐ€ ์ž๊ธฐ ์ž์‹ ์ธ ๊ฒฝ์šฐ ํ•˜๋‚˜์˜ ํŠธ๋ฆฌ๋กœ ํ•ฉ์ณ์•ผ ํ•˜๋Š” ์ด๋™ ๊ณผ์ •์ด ํ•„์š”ํ•˜๊ธฐ์— ํšŸ์ˆ˜๋ฅผ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

5 4
1 2
1 3
2 3
4 5

 

์œ„ ์ž…๋ ฅ์„ ํ’€์ดํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ parent[1] = 1, parent[2] = 2 ์ด๋ฏ€๋กœ ๋ถ€๋ชจ๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ํ•ฉ์น˜๋Š” ๊ณผ์ •์„ ํ†ตํ•ด parent[1]= 1, parent[2] = 1๋กœ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

๋‹ค์Œ์œผ๋กœ parent[1] = 1, parent[3] = 3, ์—ญ์‹œ ๋ถ€๋ชจ๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ํ•ฉ์น˜๋Š” ๊ณผ์ •์„ ํ†ตํ•ด parent[1] = 1, parent[3] = 1๋กœ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

๋‹ค์Œ์œผ๋กœ parent[2] = 1, parent[3] = 1 ์ด๋ฏ€๋กœ ๋‘˜ ๋‹ค ๋ถ€๋ชจ๊ฐ€ ๊ฐ™์œผ๋‹ˆ ์‚ฌ์ดํด์ด ์ƒ๊น๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋–ผ์–ด๋‚ด๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ํšŸ์ˆ˜๋ฅผ 1 ์ฆ๊ฐ€์‹œ์ผœ์ค๋‹ˆ๋‹ค.

parent[4] = 4, parent[5] = 5, ๋‘˜ ๋‹ค ๋ถ€๋ชจ๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ํ•ฉ์น˜๋Š” ๊ณผ์ •์„ ํ†ตํ•ด parent[4] = 4, parent[5] = 5๋กœ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

 

์ด์ œ ์ž…๋ ฅ์ด ์ „๋ถ€ ๋๋‚˜๋ฉด ํŠธ๋ฆฌ๋ฅผ ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์ฃผ๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ์œ„ ์ƒํ™ฉ์—์„œ node4๋ฅผ node1 ์˜ ๋…ธ๋“œ ์ชฝ์œผ๋กœ ๋ถ™์—ฌ์ฃผ๋ฉด ํ•˜๋‚˜์˜ ๋…ธ๋“œ๊ฐ€ ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ node = parent[node]์ธ ๊ฒฝ์šฐ๋Š” ์ „๋ถ€ ๋ถ™์—ฌ์ค€๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ํšŸ์ˆ˜๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

์•„๋ž˜๋Š” ์ถ”๊ฐ€์ ์ธ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์ž…๋‹ˆ๋‹ค.

3 2
1 2 
2 3

-> 0

8 7
1 3
1 2
2 4
3 4
5 6
5 7
6 7

-> 4

5 6
1 2 
1 3
1 4
2 5
3 5
4 5

->2

๋Œ“๊ธ€