Disjoint Set - GitDeveloperKim/DreamEach GitHub Wiki

disjoint set

  • ์„œ๋กœ์†Œ ์ง‘ํ•ฉ(disjoint sets)๋ž€ ๊ณตํ†ต ์›์†Œ๊ฐ€ ์—†๋Š” ๋‘ ์ง‘ํ•ฉ์„ ์˜๋ฏธ
  • ์„œ๋กœ์†Œ ๋ถ€๋ถ„ ์ง‘ํ•ฉ๋“ค๋กœ ๋‚˜๋ˆ„์–ด์ง„ ์›์†Œ๋“ค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ
  • ํ•ฉ์ง‘ํ•ฉ(Union) : ๋‘๊ฐœ์˜ ์›์†Œ๊ฐ€ ํฌํ•จ๋œ ์ง‘ํ•ฉ์„ ํ•˜๋‚˜์˜ ์ง‘ํ•ฉ์œผ๋กœ ํ•ฉ์น˜๋Š” ์—ฐ์‚ฐ
  • ์ฐพ๊ธฐ (find) : ํŠน์ •ํ•œ ์›์†Œ๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ์ด ์–ด๋–ค ์ง‘ํ•ฉ์ธ์ง€ ์•Œ๋ ค์ฃผ๋Š” ์—ฐ์‚ฐ
  • click
  1. ํ•ฉ์ง‘ํ•ฉ(Union) ์—ฐ์‚ฐ์„ ํ™•์ธํ•˜์—ฌ ์„œ๋กœ ์—ฐ๊ฒฐ๋œ ๋‘ ๋…ธ๋“œ A,B๋ฅผ ํ™•์ธ
    1. A์™€ B์˜ ๋ฃจํŠธ๋…ธ๋“œ A', B'๋ฅผ ๊ฐ๊ฐ ์ฐพ๋Š”๋‹ค
    2. A'๋ฅผ B'์˜ ๋ถ€๋ชจ ๋…ธ๋“œ๋กœ ์„ค์ •ํ•œ๋‹ค
  2. ๋ชจ๋“  ํ•ฉ์ง‘ํ•ฉ(Union) ์—ฐ์‚ฐ์„ ์ฒ˜๋ฆฌํ•  ๋•Œ๊นŒ์ง€ 1๋ฒˆ์˜ ๊ณผ์ •์„ ๋ฐ˜๋ณต

make parent


parent = new int[V+1];
for (int i = 1; i <= V; i++) {
	parent[i] = i;	// ์ž๊ธฐ์ž์‹  ๊ฐ€๋ฆฌํ‚ค๊ธฐ 
}

find

  • parent[x] = y; // x๋ฒˆ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๋Š” y๋…ธ๋“œ ๋ผ๋Š” ์˜๋ฏธ
  • ํ•ฉ์ง‘ํ•ฉ ์—ฐ์‚ฐ์ด ํŽธํ–ฅ๋˜๊ฒŒ ์ด๋ฃจ์–ด์ง€๋Š” ๊ฒฝ์šฐ ์ฐพ๊ธฐ ํ•จ์ˆ˜๊ฐ€ ๋น„ํšจ์œจ์ ์œผ๋กœ ๋™์ž‘ (์ตœ์•… O(V))
  • ๊ฒฝ๋กœ ์••์ถ•(Path Compression) ์„ ์ด์šฉ, ๋ถ€๋ชจ ํ…Œ์ด๋ธ” ๊ฐ’์„ ๋ฐ”๋กœ ๊ฐฑ์‹ 

public static int find (int x) {
	if (x == parent[x]) {
		return x;
	} else {
		return parent[x] = find(parent[x]); // ๋ถ€๋ชจ๊ฐ’์ด ๋ฃจํŠธ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋„๋ก
	}		
}

union

  • ๋” ํฐ ๋…ธ๋“œ๊ฐ€ ์ž‘์€ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒƒ์ด ๊ด€ํ–‰ (1)<-(4)

public static void union (int x, int y) {
	x = find(x);
	y = find(y);

        // ๋” ํฐ ๋…ธ๋“œ๊ฐ€ ์ž‘์€ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒƒ์ด ๊ด€ํ–‰
        if (x < y) {
            parent[y] = x;
        } else {
            parent[x] = y;
        }	
/*
        // ๊ฐ„๋‹จํžˆ ํ‘œํ˜„
	if (x != y) {
		parent[y] = x;
	}
*/
}
โš ๏ธ **GitHub.com Fallback** โš ๏ธ