๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ–‹๏ธ ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜/์•Œ๊ณ ๋ฆฌ์ฆ˜,์ž๋ฃŒ๊ตฌ์กฐ

[๊ทธ๋ž˜ํ”„] ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ (ํ”„๋ฆผ/ํฌ๋ฃจ์Šค์นผ/์œ ๋‹ˆ์˜จ ํŒŒ์ธ)

by OR15A 2023. 12. 8.
  • ์—ฐ๊ฒฐ ๊ทธ๋ž˜ํ”„
    • ๊ฐ„์„ ์˜ ๋ฐฉํ–ฅ์ด ์—†๋Š” ๊ทธ๋ž˜ํ”„์—์„œ ๋ชจ๋“  ์ •์ ๋“ค ๊ฐ„์— ๊ฐ„์„ ์„ ๋”ฐ๋ผ ์„œ๋กœ ๋‹ค๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋Š” ๊ทธ๋ž˜ํ”„
  • ๊ทธ๋ž˜ํ”„ ์ด๋ก ์—์„œ 'ํŠธ๋ฆฌ'๋ž€ "์‹ธ์ดํด์ด ์—†๋Š” ์—ฐ๊ฒฐ๋œ ๊ทธ๋ž˜ํ”„"๋กœ ์ •์˜๋จ
  • ํŠธ๋ฆฌ
    • ์ตœ์†Œํ•œ์˜ ๊ฐ„์„ ์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์—ฐ๊ฒฐ๋œ ๊ทธ๋ž˜ํ”„
  • ์‹ ์žฅ ํŠธ๋ฆฌ ๋น„์šฉ
    • ๊ทธ๋ž˜ํ”„์˜ ๊ฐ„์„ ์— ๊ฐ€์ค‘์น˜๊ฐ€ ์žˆ๋‹ค๋ฉด, ์‹ ์žฅ ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜๋ฅผ ๋‹ค ๋”ํ•œ ๊ฒƒ
  • ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ
    • ๊ฐ€์ค‘์น˜๊ฐ€ ์žˆ๋Š” ๋ฌดํ–ฅ ๊ทธ๋ž˜ํ”„๋กœ๋ถ€ํ„ฐ ๋งŒ๋“ค ์ˆ˜  ์žˆ๋Š” ๋ชจ๋“  ์‹ ์žฅ ํŠธ๋ฆฌ ์ค‘, ๋น„์šฉ์ด ๊ฐ€์žฅ ๋‚ฎ์€ ํŠธ๋ฆฌ
  • ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • ํ•˜๋‚˜์˜ ์ •์  ์ง‘ํ•ฉ์„ ์ ์  ํ‚ค์›Œ๋‚˜๊ฐ€๋Š” ๋ฐฉ์‹
  • ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • ์—ฌ๋Ÿฌ ์ •์  ์ง‘ํ•ฉ์œผ๋กœ ์‹œ์ž‘ํ•ด์„œ ์ง‘ํ•ฉ๋“ค์„ ํ•ฉ์ณ๋‚˜๊ฐ€๋Š” ๋ฐฉ์‹

 

 

ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ๋ฅผ ์ฐพ๋Š”๋‹ค๋Š” ๊ฒƒ์€ ๊ถ๊ทน์ ์œผ๋กœ |V|-1๊ฐœ์˜ ๊ฐ„์„ ์„ ์ฐพ๋Š” ๊ณผ์ •
  • ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์•„๋ฌด ๊ฐ„์„ ๋„ ์—†๋Š” ์ƒํƒœ์—์„œ ๊ฐ„์„ ์„ ํ•˜๋‚˜์”ฉ ๋”ํ•˜๋Š” ์ž‘์—…์„ |V|-1๋ฒˆ ํ•œ๋‹ค
  • ์ •์  ์ง‘ํ•ฉ S๋ฅผ ์šด์šฉํ•จ
    • ์ฒ˜์Œ์—๋Š” ์‹œ์ž‘์ •์  r ํ•˜๋‚˜๋กœ ์‹œ์ž‘ํ•ด์„œ ํ•œ ๋ฒˆ์— ์ •์ ์„ ํ•˜๋‚˜์”ฉ ๋”ํ•ด๊ฐ
    • ์ •์ ์„ ํ•˜๋‚˜ ๋”ํ•  ๋•Œ ๋Œ€์‘๋˜๋Š” ๊ฐ„์„ ์ด ํ•˜๋‚˜์”ฉ ๋”ํ•ด์ง
    • ์ •์  |V|-1๊ฐœ๋ฅผ ๋”ํ•˜๋ฉด ๋ชจ๋“  ์ •์ ์ด ์ง‘ํ•ฉ S์— ๋“ค์–ด์˜ค๊ธฐ๋จ
  • |V|-1๊ฐœ์˜ ๊ฐ„์„ ์ด ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ๋ฅผ ์ด๋ฃธ
  • ์ธ์ ‘ํ•œ ์ •์  ์ค‘ ํ˜„์žฌ๊นŒ์ง€์˜ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ ์ •์  v๋ฅผ ์‹ ์žฅํŠธ๋ฆฌ์— ์—ฐ๊ฒฐ์‹œํ‚ฌ ๋–„ ๊ฐ€์žฅ ์ตœ์†Œ ๋น„์šฉ์˜ ๋“œ๋Š” ์ •์  u๋ฅผ ์ €์žฅํ•จ
  • ์ด์™„
    • ์ง‘ํ•ฉ S๋กœ ๋“ค์–ด๊ฐ„ ์ •์ ์— ์˜ํ•ด์„œ ์ตœ์†Œ ์—ฐ๊ฒฐ ๋น„์šฉ์— ๋ณ€๋™์ด ์ƒ๊ธฐ๋Š” ๊ฒƒ. ๊ฐ’์ด ๋ฐ”๋€Œ๋Š” ๊ฒƒ

 

 

ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • ์—ฌ๋Ÿฌ ์ •์  ์ง‘ํ•ฉ์œผ๋กœ ์‹œ์ž‘ํ•ด์„œ ์ง‘ํ•ฉ๋“ค์„ ํ•ฉ์ณ๋‚˜๊ฐ€๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™
  • ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์—ฌ๋Ÿฌ ์ •์  ์ง‘ํ•ฉ๋“ค์„ ์šด์˜ํ•จ
    • ๊ฐ ์ •์ ‘ ์ง‘ํ•ฉ์€ ์‹ธ์ดํด์ด ์—†๋Š” ์—ฐ๊ฒฐ๋œ ๊ทธ๋ž˜ํ”„๋กœ ํ•˜๋‚˜์˜ ํŠธ๋ฆฌ์— ํ•ด๋‹นํ•จ
    • ํŠธ๋ฆฌ๋ฅผ ํ•ฉ์ณ์„œ ํ•˜๋‚˜์˜ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด, ์–‘ ๋์ ์ด ๋‘ ์ง‘ํ•ฉ์— ๊ฑธ์ณ ์žˆ๋Š” ๊ฐ„์„ ์ด ํ•„์š”ํ•จ
    • ์ฒ˜์Œ์—  n๊ฐœ์˜ ํŠธ๋ฆฌ๋กœ ์‹œ์ž‘ํ•˜์—ฌ์„œ, ๋‘ ํŠธ๋ฆฌ๋ฅผ ํ•˜๋‚˜๋กœ ํ•ฉ์น˜๋Š” ๊ณผ์ •์„ n-1๋ฒˆ ์ˆ˜ํ–‰ํ•˜๋ฉด ํ•˜๋‚˜์˜ ํŠธ๋ฆฌ๊ฐ€ ๋จ
  • ๊ฐ„์„ ์„ ๋”ํ•˜๋Š” ๊ทœ์น™
    • ์ค‘๊ฐ„์˜ ํ•œ ์‹œ์ ์„ ๊ท€๋‚ฉ์ ์œผ๋กœ ๋ณด๋ฉด, ๊ทธ ์‹œ์ ์— ๊ตฌ์ถ•๋œ ์„œ๋กœ ๋‹ค๋ฅธ ์ง‘ํ•ฉ์„ ์—ฐ๊ฒฐํ•˜๋Š” ๋ชจ๋“  ๊ฐ„์„  ์ค‘ ์ตœ์†Œ ๋น„์šฉ ๊ฐ„์„ ์„ ์„ ํƒํ•จ
    • ํ•œ ๋ฒˆ์— ์ตœ์†Œ ๋น„์šฉ ๊ฐ„์„ ์„ ํ•˜๋‚˜์”ฉ ๋”ํ•˜๋Š”๋ฐ, ๊ธฐ์กด์— ํ™•์ •ํ•ด๋†“์€ ๊ฐ„์„  ์ง‘ํ•ฉ๊ณผ ์‹ธ์ดํด์„ ๋งŒ๋“ค์ง€ ์•Š๋Š” ๋ฒ”์œ„์—์„œ ๋”ํ•จ
  • ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋จผ์ € ๋ชจ๋“  ๊ฐ„์„ ์„ ๋น„์šฉ์ด ์ž‘์€ ์ˆœ์„œ๋กœ ์ •๋ ฌํ•จ
    • ์ •์ ๋“ค์„ n๊ฐœ์˜ ์ง‘ํ•ฉ์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•จ
    • ๋น„์šฉ์ด ๊ฐ€์žฅ ์ž‘์€ ๊ฐ„์„ ๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ ํ•œ ๋ฒˆ์”ฉ ์‚ดํ•Œ
    • ํ•ด๋‹น ๊ฐ„์„ ์ด ๋‘ ์ •์  ์ง‘ํ•ฉ์„ ํ•˜๋‚˜๋กœ ํ•ฉ์น  ์ˆ˜ ์žˆ์œผ๋ฉด ๊ฐ„์„ ์€ ์„ ํƒ๋˜์–ด ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ์˜ ์ผ๋ถ€๋กœ ํ™•์ •๋จ. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ทธ ๊ฐ„์„ ์€ ๋ฒ„๋ฆผ
    • ์ด๋Ÿฐ ์‹์œผ๋กœ n-1๋ฒˆ์˜ ์„ฑ๊ณต์ • ์ง‘ํ•ฉ ํ•ฉ์น˜๊ธฐ๊ฐ€ ์ด๋ฃจ์–ด์งˆ ๋•Œ๊นŒ์ง€ ์ง„ํ–‰

 

ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ๋‘ ์•Œ๊ณ ์ง€๋ฆ„์€ ์‚ฌ์‹ค ํ•œ ๊ฐ€์ง€ ์›๋ฆฌ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํ•จ
  • n-1๊ฐœ์˜ ๊ฐ„์„ ์„ ๋”ํ•ด๊ฐ€๋Š” ์ˆœ์„œ๋ฅผ ๋‚˜๋ฆ„๋Œ€๋กœ ์ •ํ•ด์คŒ
  • ์ด๋ ‡๊ฒŒ ๋”ํ•ด๋‚˜๊ฐ€๋Š” ๊ฐ„์„ ์ด ๊ถ๊ทน์ ์œผ๋กœ ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ์— ์ด๋ฅด๋Š” ๊ธธ์„ ๋†“์น˜์ง€ ์•Š์•„, ํ•ด๋‹น ๊ฐ„์„ ์„ ์ผ๋‹จ ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ์— ํฌํ•จ์‹œํ‚ค๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธ

 

 

์ฐธ๊ณ ์ž๋ฃŒ : ใ€Œ์‰ฝ๊ฒŒ ๋ฐฐ์šฐ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ with ์ž๋ฐ”ใ€

 

(+)

์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ(Union-Find) ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ์ฃผ๋กœ ๋‘ ์š”์†Œ๊ฐ€ ๊ฐ™์€ ์ง‘ํ•ฉ์— ์†ํ•˜๋Š”์ง€ ๋น ๋ฅด๊ฒŒ ํŒ๋‹จํ•˜๊ณ , ๋‘ ์ง‘ํ•ฉ์„ ํ•ฉ์น˜๋Š” ๋ฐ ์‚ฌ์šฉ๋จ
  • ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ฃผ๋กœ ๊ทธ๋ž˜ํ”„์—์„œ ์—ฐ๊ฒฐ๋œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ฐพ๊ฑฐ๋‚˜, ์‚ฌ์ดํด์ด ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•  ๋•Œ ์‚ฌ์šฉํ•จ
  • Find : ์–ด๋–ค ์š”์†Œ๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ์˜ ๋Œ€ํ‘œ(๋ฃจํŠธ)๋ฅผ ์ฐพ๊ธฐ
  • Union : ๋‘ ์ง‘ํ•ฉ์„ ํ•˜๋‚˜์˜ ์ง‘ํ•ฉ์œผ๋กœ ํ•ฉ์น˜๊ธฐ
  • [๊ตฌํ˜„ ๋ฐฉ๋ฒ•]
    • ์ดˆ๊ธฐํ™”
      • ๊ฐ ์š”์†Œ์˜ ๋ถ€๋ชจ๋ฅผ ์ž๊ธฐ ์ž์‹ ์œผ๋กœ ์„ค์ •. ์ด ๋•Œ, ๊ฐ ์š”์†Œ๋Š” ์ž์‹ ๋งŒ์„ ํฌํ•จํ•˜๋Š” ์ง‘ํ•ฉ์˜ ๋Œ€ํ‘œ(๋ฃจํŠธ)
    • Find ์—ฐ์‚ฐ
      • ํŠน์ • ์š”์†Œ์˜ ๋ฃจํŠธ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด, ๋ถ€๋ชจ ์š”์†Œ๋ฅผ ๋”ฐ๋ผ๊ฐ€๋ฉด์„œ ๋ฃจํŠธ๋ฅผ ์ฐพ๊ธฐ
      • ๊ฒฝ๋กœ ์••์ถ•(Path Compression)์„ ์‚ฌ์šฉํ•˜์—ฌ, Find ์—ฐ์‚ฐ ๋„์ค‘ ๋งŒ๋‚˜๋Š” ๋ชจ๋“  ์š”์†Œ์˜ ๋ถ€๋ชจ๋ฅผ ๋ฃจํŠธ๋กœ ์ง์ ‘ ์—ฐ๊ฒฐ(๋‹ค์Œ ๋ฒˆ Find ์—ฐ์‚ฐ์ด ๋” ๋นจ๋ผ์ง)
    • Union ์—ฐ์‚ฐ
      • ๋‘ ์š”์†Œ์˜ ๋ฃจํŠธ๋ฅผ ์ฐพ๊ธฐ
      • ๋‘ ๋ฃจํŠธ๊ฐ€ ๋‹ค๋ฅด๋ฉด, ํ•œ ๋ฃจํŠธ๋ฅผ ๋‹ค๋ฅธ ๋ฃจํŠธ์˜ ์ž์‹์œผ๋กœ ๋งŒ๋“ค๊ธฐ(๋‘ ์ง‘ํ•ฉ์„ ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์ง)
//์˜ˆ์‹œ ์ฝ”๋“œ
class UnionFind {
    private int[] parent;

    public UnionFind(int size) {
        parent = new int[size];
        for (int i = 0; i < size; i++) {
            parent[i] = i;
        }
    }

    public int find(int x) {
        if (x == parent[x]) {
            return x;
        }
        return parent[x] = find(parent[x]); // ๊ฒฝ๋กœ ์••์ถ•
    }

    public void union(int x, int y) {
        int rootX = find(x);
        int rootY = find(y);
        if (rootX != rootY) {
            parent[rootY] = rootX;
        }
    }

    public boolean isConnected(int x, int y) {
        return find(x) == find(y);
    }
}