๐Ÿ˜Ž ๊ณต๋ถ€ํ•˜๋Š” ์ง•์ง•์•ŒํŒŒ์นด๋Š” ์ฒ˜์Œ์ด์ง€?

[์ด๊ฒƒ์ด ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค with Python]_33_์„œ๋กœ์†Œ ์ง‘ํ•ฉ ์ž๋ฃŒ๊ตฌ์กฐ ๋ณธ๋ฌธ

๐Ÿฆฅ ์ฝ”ํ…Œ/์ด๊ฒƒ์ด ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค with python

[์ด๊ฒƒ์ด ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค with Python]_33_์„œ๋กœ์†Œ ์ง‘ํ•ฉ ์ž๋ฃŒ๊ตฌ์กฐ

์ง•์ง•์•ŒํŒŒ์นด 2022. 2. 13. 00:16
728x90
๋ฐ˜์‘ํ˜•

220213 ์ž‘์„ฑ

<๋ณธ ๋ธ”๋กœ๊ทธ๋Š” ใ€Ž์ด๊ฒƒ์ด ์ทจ์—…์„ ์œ„ํ•œ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹คใ€ ์˜ youtube๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค>

https://www.youtube.com/watch?v=Ha0w2dJa2Nk&list=PLVsNizTWUw7H9_of5YCB0FmsSc-K44y81&index=33 

 

 

 

 

 

 

1. ์„œ๋กœ์†Œ ์ง‘ํ•ฉ (Disjoint Sets)SS

: ๊ณตํ†ต ์›์†Œ๊ฐ€ ์—†๋Š” ๋‘ ์ง‘ํ•ฉ

 

 

 

2. ์„œ๋กœ์†Œ ์ง‘ํ•ฉ ์ž๋ฃŒ ๊ตฌ์กฐ

: ์„œ๋กœ์†Œ ๋ถ€๋ถ„ ์ง‘ํ•ฉ๋“ค๋กœ ๋‚˜๋ˆ„์–ด์ง„ ์›์†Œ๋“ค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ

-> ํ•ฉ์ง‘ํ•ฉ (union) : ๋‘ ๊ฐœ์˜ ์›์†Œ๊ฐ€ ํฌํ•จ๋œ ์ง‘ํ•ฉ์„ ํ•˜๋‚˜์˜ ์ง‘ํ•ฉ์œผ๋กœ ํ•ฉ์น˜๋Š” ์—ฐ์‚ฐ

-> ์ฐพ๊ธฐ (find) : ํŠน์ •ํ•œ ์›์†Œ๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ์ด ์–ด๋–ค ์ง‘ํ•ฉ์ธ์ง€ ์•Œ๋ ค์ฃผ๋Š” ์—ฐ์‚ฐ

: ํ•ฉ์น˜๊ธฐ ์ฐพ๊ธฐ ์ž๋ฃŒ๊ตฌ์กฐ๋ผ ๋ถˆ๋ฆฐ๋‹ค

 

1) ํ•ฉ์ง‘ํ•ฉ ์—ฐ์‚ฐ ํ™•์ธ, ์„œ๋กœ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ A, B ํ™•์ธ

- A์™€ B์˜ ๋ฃจํŠธ ๋…ธ๋“œ A', B' ๊ฐ๊ฐ ์ฐพ๊ธฐ

- A'๋ฅผ B'์˜ ๋ถ€๋ชจ ๋…ธ๋“œ๋กœ ์„ค์ •

2) ๋ชจ๋“  ํ•ฉ์ง‘ํ•ฉ ์—ฐ์‚ฐ์„ ์ฒ˜๋ฆฌํ•  ๋•Œ๊นŒ์ง€ 1๋ฒˆ์˜ ๊ณผ์ • ๋ฐ˜๋ณต

 

=> ์—ฐ๊ฒฐ์„ฑ์„ ํ†ตํ•ด ์†์‰ฝ๊ฒŒ ์ง‘ํ•ฉ์˜ ํ˜•ํƒœ ํ™•์ธ ๊ฐ€๋Šฅ

=> ๋ฃจํŠธ ๋…ธ๋“œ์— ์ฆ‰์‹œ ์ ‘๊ทผ X

=> ๋ฃจํŠธ ๋…ธ๋“œ์— ์ ‘๊ทผํ•˜๊ธฐ์œ„ํ•ด ๋ถ€๋ชจ ํ…Œ์ด๋ธ”์„ ๊ณ„์†ํ•ด์„œ ํ™•์ธํ•˜๋ฉฐ ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ€๊ธฐ

 

 

 

  • python
# ํŠน์ • ์›์†Œ๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ์„ ์ฐพ๊ธฐ
def find_parent(parent, x):
    # ๋ฃจํŠธ ๋…ธ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด, ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์ฐพ์„ ๋•Œ๊นŒ์ง€ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœ
    if parent[x] != x:
        return find_parent(parent, parent[x])
    return x

# ๋‘ ์›์†Œ๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ์„ ํ•ฉ์น˜๊ธฐ
def union_parent(parent, a, b):
    a = find_parent(parent, a)
    b = find_parent(parent, b)
    if a < b:
        parent[b] = a
    else:
        parent[a] = b

# ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜์™€ ๊ฐ„์„ (Union ์—ฐ์‚ฐ)์˜ ๊ฐœ์ˆ˜ ์ž…๋ ฅ ๋ฐ›๊ธฐ
v, e = map(int, input().split())
parent = [0] * (v + 1) # ๋ถ€๋ชจ ํ…Œ์ด๋ธ” ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ

# ๋ถ€๋ชจ ํ…Œ์ด๋ธ”์ƒ์—์„œ, ๋ถ€๋ชจ๋ฅผ ์ž๊ธฐ ์ž์‹ ์œผ๋กœ ์ดˆ๊ธฐํ™”
for i in range(1, v + 1):
    parent[i] = i

# Union ์—ฐ์‚ฐ์„ ๊ฐ๊ฐ ์ˆ˜ํ–‰
for i in range(e):
    a, b = map(int, input().split())
    union_parent(parent, a, b)

# ๊ฐ ์›์†Œ๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ ์ถœ๋ ฅํ•˜๊ธฐ
print('๊ฐ ์›์†Œ๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ: ', end='')
for i in range(1, v + 1):
    print(find_parent(parent, i), end=' ')

print()

# ๋ถ€๋ชจ ํ…Œ์ด๋ธ” ๋‚ด์šฉ ์ถœ๋ ฅํ•˜๊ธฐ
print('๋ถ€๋ชจ ํ…Œ์ด๋ธ”: ', end='')
for i in range(1, v + 1):
    print(parent[i], end=' ')

 

  • c++
#include <bits/stdc++.h>

using namespace std;

// ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜(V)์™€ ๊ฐ„์„ (Union ์—ฐ์‚ฐ)์˜ ๊ฐœ์ˆ˜(E)
// ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋Š” ์ตœ๋Œ€ 100,000๊ฐœ๋ผ๊ณ  ๊ฐ€์ •
int v, e;
int parent[100001]; // ๋ถ€๋ชจ ํ…Œ์ด๋ธ” ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ

// ํŠน์ • ์›์†Œ๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ์„ ์ฐพ๊ธฐ
int findParent(int x) {
    // ๋ฃจํŠธ ๋…ธ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด, ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์ฐพ์„ ๋•Œ๊นŒ์ง€ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœ
    if (x == parent[x]) return x;
    return findParent(parent[x]);
}

// ๋‘ ์›์†Œ๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ์„ ํ•ฉ์น˜๊ธฐ
void unionParent(int a, int b) {
    a = findParent(a);
    b = findParent(b);
    if (a < b) parent[b] = a;
    else parent[a] = b;
}

int main(void) {
    cin >> v >> e;

    // ๋ถ€๋ชจ ํ…Œ์ด๋ธ”์ƒ์—์„œ, ๋ถ€๋ชจ๋ฅผ ์ž๊ธฐ ์ž์‹ ์œผ๋กœ ์ดˆ๊ธฐํ™”
    for (int i = 1; i <= v; i++) {
        parent[i] = i;
    }

    // Union ์—ฐ์‚ฐ์„ ๊ฐ๊ฐ ์ˆ˜ํ–‰
    for (int i = 0; i < e; i++) {
        int a, b;
        cin >> a >> b;
        unionParent(a, b);
    }

    // ๊ฐ ์›์†Œ๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ ์ถœ๋ ฅํ•˜๊ธฐ
    cout << "๊ฐ ์›์†Œ๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ: ";
    for (int i = 1; i <= v; i++) {
        cout << findParent(i) << ' ';
    }
    cout << '\n';

    // ๋ถ€๋ชจ ํ…Œ์ด๋ธ” ๋‚ด์šฉ ์ถœ๋ ฅํ•˜๊ธฐ
    cout << "๋ถ€๋ชจ ํ…Œ์ด๋ธ”: ";
    for (int i = 1; i <= v; i++) {
        cout << parent[i] << ' ';
    }
    cout << '\n';
}
  • java
import java.util.*;

public class Main {

    // ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜(V)์™€ ๊ฐ„์„ (Union ์—ฐ์‚ฐ)์˜ ๊ฐœ์ˆ˜(E)
    // ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋Š” ์ตœ๋Œ€ 100,000๊ฐœ๋ผ๊ณ  ๊ฐ€์ •
    public static int v, e;
    public static int[] parent = new int[100001]; // ๋ถ€๋ชจ ํ…Œ์ด๋ธ” ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ

    // ํŠน์ • ์›์†Œ๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ์„ ์ฐพ๊ธฐ
    public static int findParent(int x) {
        // ๋ฃจํŠธ ๋…ธ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด, ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์ฐพ์„ ๋•Œ๊นŒ์ง€ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœ
        if (x == parent[x]) return x;
        return findParent(parent[x]);
    }

    // ๋‘ ์›์†Œ๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ์„ ํ•ฉ์น˜๊ธฐ
    public static void unionParent(int a, int b) {
        a = findParent(a);
        b = findParent(b);
        if (a < b) parent[b] = a;
        else parent[a] = b;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        v = sc.nextInt();
        e = sc.nextInt();

        // ๋ถ€๋ชจ ํ…Œ์ด๋ธ”์ƒ์—์„œ, ๋ถ€๋ชจ๋ฅผ ์ž๊ธฐ ์ž์‹ ์œผ๋กœ ์ดˆ๊ธฐํ™”
        for (int i = 1; i <= v; i++) {
            parent[i] = i;
        }

        // Union ์—ฐ์‚ฐ์„ ๊ฐ๊ฐ ์ˆ˜ํ–‰
        for (int i = 0; i < e; i++) {
            int a = sc.nextInt();
            int b = sc.nextInt();
            unionParent(a, b);
        }

        // ๊ฐ ์›์†Œ๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ ์ถœ๋ ฅํ•˜๊ธฐ
        System.out.print("๊ฐ ์›์†Œ๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ: ");
        for (int i = 1; i <= v; i++) {
            System.out.print(findParent(i) + " ");
        }
        System.out.println();

        // ๋ถ€๋ชจ ํ…Œ์ด๋ธ” ๋‚ด์šฉ ์ถœ๋ ฅํ•˜๊ธฐ
        System.out.print("๋ถ€๋ชจ ํ…Œ์ด๋ธ”: ");
        for (int i = 1; i <= v; i++) {
            System.out.print(parent[i] + " ");
        }
        System.out.println();
    }
}

 

 

+ ๋ฌธ์ œ์ 

: ํ•ฉ์ง‘ํ•ฉ ์—ฐ์‚ฐ์ด ํŽธํ–ฅ๋œ๋‹ค๋ฉด ์ฐพ๊ธฐ ํ•จ์ˆ˜๊ฐ€ ๋น„ํšจ์œจ์ ์œผ๋กœ ๋™์ž‘

: ์ฐพ๊ธฐ ํ•จ์ˆ˜๊ฐ€ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋‹ค ํ™•์ธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(V)

 

 

 

 

3. ๊ฒฝ๋กœ ์••์ถ•

: ์ฐพ๊ธฐ ํ•จ์ˆ˜๋ฅผ ์ตœ์ ํ™” ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ฒฝ๋กœ ์••์ถ• ์ด์šฉ

: ์ฐพ๊ธฐ ํ•จ์ˆ˜๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœํ•œ ๋’ค์— ๋ถ€๋ชจ ํ…Œ์ด๋ธ” ๊ฐ’์„ ๋ฐ”๋กœ ๊ฐฑ์‹ !!!

: ๊ฐ ๋…ธ๋“œ์— ๋Œ€ํ•˜์—ฌ ์ฐพ๊ธฐ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ์ดํ›„์— ํ•ด๋‹น ๋…ธ๋“œ์˜ ๋ฃจํŠธ ๋…ธ๋“œ๊ฐ€ ๋ฐ”๋กœ ๋ถ€๋ชจ ๋…ธ๋“œ๊ฐ€ ๋œ๋‹ค

 

# ํŠน์ • ์›์†Œ๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ์„ ์ฐพ๊ธฐ
def find_parent(parent, x):
    # ๋ฃจํŠธ ๋…ธ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด, ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์ฐพ์„ ๋•Œ๊นŒ์ง€ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœ
    if parent[x] != x:
        parent[x] = find_parent(parent, parent[x])
    return parent[x]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
๋ฐ˜์‘ํ˜•
Comments