๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Programming/Algorithm

[Java] Kruskal's Algorithm ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ - ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ(MST)

728x90
๋ฐ˜์‘ํ˜•

์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ MST(Minimun Spanning Tree) - ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž๋ฐ” ๊ตฌํ˜„

๐Ÿง ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ MST(Minimun Spanning Tree)๋ž€?

์ตœ์†Œํ•œ์˜ ๊ฐ€์ค‘์น˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ์ •์ ์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์„ ์ˆ˜ ์žˆ๊ฒŒํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค.

 

์˜ˆ์‹œ)

๋„์‹œ๋“ค์€ ๋ชจ๋‘ ๋‹ค๋ฆฌ๋กœ ์—ฐ๊ฒฐ๋˜์–ด์žˆ์„ ๋•Œ, ๋ชจ๋“  ๋„์‹œ๋ฅผ ๊ฐˆ ์ˆ˜ ์žˆ๊ฒŒ ๋‹ค๋ฆฌ๋ฅผ ์—ฐ๊ฒฐํ•˜๋˜ ์ตœ์†Œํ•œ์˜ ๋‹ค๋ฆฌ ๊ธธ์ด๋งŒ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

(๋„์‹œ๊ฐ€ ๊ฐ€๋กœ๋“ฑ์œผ๋กœ ๋‹ค๋ฆฌ๊ฐ€ ์ „์„ ์œผ๋กœ ๋ฐ”๋€”์ˆ˜๋„ ์žˆ๋‹ค.)

๋„ค๋น„๊ฒŒ์ด์…˜์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ

Minimun Spanning Tree

๋ชจ๋“  ์ •์ (node ํ˜น์€ vortex)๊ฐ€ ์—ฐ๊ฒฐ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ ์ค‘ ๊ฐ€์žฅ ์ ์€ ๊ฐ€์ค‘์น˜(์—ฌ๊ธฐ์„  ๊ฑฐ๋ฆฌ)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ๋กœ

 

์ฃผ์˜์‚ฌํ•ญ

์—ฌ๊ธฐ์„œ ์—ฐ๊ฒฐ์ด๋ž€ ๋‹ค๋ฅธ ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ์„œ ๊ฐ€๋Š” ๊ฒƒ์„ ํฌํ•จํ•œ๋‹ค.

๊ฐ„์„  ํ˜น์€ ๋ธŒ๋žœ์น˜(๋…ธ๋“œ๋ฅผ ์ด์–ด์ฃผ๋Š” ์„ , ๊ฑฐ๋ฆฌ)๋Š” ๋ฐฉํ–ฅ์„ฑ์„ ๊ฐ–์ง€ ์•Š๋Š”๋‹ค.(์—ฐ๊ฒฐ๋งŒ ๋˜์–ด์žˆ์„ ๋ฟ, ์ถœ๋ฐœ๊ณผ ๋„์ฐฉ์ง€์ ์ด ๊ณ ์ •๋œ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.)

๐Ÿง ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋กœ์ง(Kruskal's Algorithm Logic)

1. ๊ฐ€์žฅ ์ ์€ ๊ฐ€์ค‘์น˜๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ๋‚˜์—ดํ•œ๋‹ค.

2. ๊ฐ€์ค‘์น˜๊ฐ€ ์ ์€ ์ˆœ์„œ๋Œ€๋กœ ๊ฒฝ๋กœ๋ฅผ ์„ ํƒํ•ด์„œ ๋…ธ๋“œ๋“ค์„ ์ด์–ด์ค€๋‹ค.

3. ์„œํด(circle)์ด ์ƒ๊ธฐ์ง€ ์•Š๊ฒŒ ์ฃผ์˜ํ•œ๋‹ค.

4. ๋ชจ๋“  ๋…ธ๋“œ์˜ ํƒ์ƒ‰์ด  ๋๋‚˜๋ฉด ์ข…๋ฃŒํ•œ๋‹ค.

 

๊ฐ€์ • ์ ์€ ๊ฐ€์ค‘์น˜๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ๋‚˜์—ดํ•œ๋‹ค.

์œ„ ๊ทธ๋ฆผ์—์„œ ๊ฐ€์ค‘์น˜๋Š” "๊ฑฐ๋ฆฌ"์ด๋ฏ€๋กœ ๊ฐ€์žฅ ์ž‘์€ ๊ฒฝ๋กœ๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ๋‚˜์—ดํ•œ๋‹ค.(๊ฐ™์€ ๊ฐ€์ค‘์น˜๋Š” ์ˆœ์„œ๊ฐ€ ์ƒ๊ด€ ์—†๋‹ค.)

์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ A, D B, D B, E A, E A, C C, E C, D A, B
๊ฑฐ๋ฆฌ(๊ฐ€์ค‘์น˜) 1 2 2 3 3 3 3 5

๊ฐ€์ค‘์น˜๊ฐ€ ์ ์€ ์ˆœ์„œ๋Œ€๋กœ ๊ฒฝ๋กœ๋ฅผ ์„ ํƒํ•ด์„œ ๋…ธ๋“œ๋“ค์„ ์ด์–ด์ค€๋‹ค.

๊ฑฐ๋ฆฌ 1 ์„ ํƒ ํ›„ ์—ฐ๊ฒฐ
๊ฑฐ๋ฆฌ 2 ์„ ํƒ ํ›„ ์—ฐ๊ฒฐ

 

๊ฑฐ๋ฆฌ 2 ์„ ํƒ ํ›„ ์—ฐ๊ฒฐ

์„œํด(circle)์ด ์ƒ๊ธฐ์ง€ ์•Š๊ฒŒ ์ฃผ์˜ํ•œ๋‹ค.

๊ฑฐ๋ฆฌ 3์ธ A, E ์„ ํƒ

์ด๋•Œ, ๊ฐ€์ค‘์น˜ 3์„ ๊ฐ€์ง€๋Š” [A, E]๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฐ„์„ ์„ ์„ ํƒํ•˜๋ฉด ์„œํด(circle)์ด ๋ฐœ์ƒํ•œ๋‹ค.

์„œํด์ด๋ž€, ์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๋…ธ๋“œ๋“ค์ด ์ˆœํ™˜ํ•˜๋Š” ํ˜•ํƒœ๊ฐ€ ๋˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

A๋…ธ๋“œ์—์„œ E๋…ธ๋“œ๋กœ๊ฐ€๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋‘ ๊ฐœ ์ด์ƒ(A->B->E, A->E)์œผ๋กœ ์ค‘๋ณต๋˜๋ฏ€๋กœ ํ•ด๋‹น ๊ฐ„์„ ์€ ์„ ํƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

๊ฑฐ๋ฆฌ 3 ์„ ํƒ ํ›„ ์—ฐ๊ฒฐ

๋งˆ์ง€๋ง‰ ๊ฑฐ๋ฆฌ์ธ 5๋ฅผ ์„ ํƒํ•˜๋ฉด ์„œํด์„ ์ƒ์„ฑํ•˜๋ฏ€๋กœ ์—ฐ๊ฒฐํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋ชจ๋“  ๋…ธ๋“œ์˜ ํƒ์ƒ‰์ด ๋๋‚˜๋ฉด ์ข…๋ฃŒํ•œ๋‹ค.

๐Ÿง ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„์„ ์œ„ํ•œ ๊ธฐ๋ฒ•(union-find, union-by-rank, path-compression)

union-find

  • find: ์„œํด์„ ์ด๋ฃจ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
  • union: ์„œํด์„ ์ด๋ฃจ์ง€ ์•Š๋Š”๋‹ค๋ฉด ์—ฐ๊ฒฐํ•œ๋‹ค.

find

์„œํด์„ ์ด๋ฃจ๋Š”์ง€ ์–ด๋–ป๊ฒŒ ํ™•์ธํ• ๊นŒ?

=> ์—ฐ๊ฒฐํ•  node์™€ ์—ฐ๊ฒฐ๋œ ๋˜ ๋‹ค๋ฅธ node๊ฐ€ ์ž์‹ ์ด ์—ฐ๊ฒฐ๋œ ๋˜ ๋‹ค๋ฅธ node์™€ ์ผ์น˜ํ•œ๋‹ค๋ฉด ์„œํด์ผ ์ด๋ฃฌ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์ด๋ฒˆ์— ์„ ํƒ๋œ ๊ฐ„์„ ์€ B-C ์ด๋‹ค.

์ด๋•Œ, B ๋…ธ๋“œ๋Š” A๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”๋ฐ C๋…ธ๋“œ๊ฐ€ A๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๋ฉด ์„œํด์ด ์ด๋ฃฌ๋‹ค.

์ด๋Š” ๋งˆ์น˜ B ๋…ธ๋“œ์™€ C๋…ธ๋“œ์˜ ๋ถ€๋ชจ ๋…ธ๋“œ๊ฐ€ A์ธ ํŠธ๋ฆฌ๊ตฌ์กฐ์™€ ์œ ์‚ฌํ•˜๋‹ค.

 

find ๊ธฐ๋ฒ•์€ ๋ชจ๋“  ๋…ธ๋“œ์˜ ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ์ž…๋ ฅ์‹œ์ผœ ์„ ํƒ๋œ ๊ฐ„์„ ์˜ ๋‘ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๋…ธ๋“œ๊ฐ€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์œ„ ๊ฒฝ์šฐ๋Š” B๋…ธ๋“œ์™€ C๋…ธ๋“œ๊ฐ€ A๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๊ธฐ์— ๋ฐ”๋กœ ์„œํด์ž„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ ๋” ๋งŽ์€ ๋…ธ๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ถ€๋ชจ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๋…ธ๋“œ ๋˜ ๊ทธ ๋ถ€๋ชจ๋…ธ๋“œ๊นŒ์ง€ ๊ณ„์†ํ•ด์„œ ํ™•์ธํ•ด์•ผํ•œ๋‹ค.

์œ„ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ B๋…ธ๋“œ์˜ ๋ถ€๋ชจ์ธ D์˜ ๋ถ€๋ชจ์ธ E์™€ ์„œํด์„ ์ด๋ฃฐ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

๋ชจ๋“  ๋ถ€๋ชจ๋…ธ๋“œ๋“ค์˜ ๋Œ€ํ•ด์„œ ๋น„๊ต๋ฅผํ•˜๋ฉด ๋” ๋งŽ์€ ๋ฐ˜๋ณตํšŸ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค. ํšŸ์ˆ˜๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด์„œ ๋ชจ๋“  ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ์ตœ์ข… root๋…ธ๋“œ๋กœ ๊ฐฑ์‹ ํ•ด๊ฐ€๋Š” ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•œ๋‹ค.

 // find: ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์ฐพ์•„๋‚ด๋Š” ํ•จ์ˆ˜
    public String find(String node) {
        // parh compression ๊ธฐ๋ฒ•์„ ์ด์šฉ(๋ฃจํŠธ๋ฅผ ๊ฐ™๊ฒŒ ๋งŒ๋“ฆ)
        if(parentNode.get(node) != node) {  // ๋ถ€๋ชจ๊ฐ€ ์ž์‹ ๊ณผ ๊ฐ™์ง€ ์•Š๋‹ค๋ฉด, ๋ฃจํŠธ๊ฐ€ ์•„๋‹˜
            parentNode.put(node, find(parentNode.get(node)));   // ์žฌ๊ท€๋ฅผ ํ†ตํ•ด ๋ถ€๋ชจ์˜ ๋ถ€๋ชจ๋กœ ๊ฐฑ์‹  => ๋ฃจํŠธ ๋…ธ๋“œ๊ฐ€ ๊ฐ™์•„์ง
        }
        return parentNode.get(node);    // ์ตœ์ข… ๋ถ€๋ชจ ๋…ธ๋“œ๋Š” ๋ฃจํŠธ
    }

๋น„๊ตํ•˜๊ณ ํ•˜๋Š” ๋…ธ๋“œ๋“ค ๋ถ€๋ชจ๋…ธ๋“œ๋Š” ์ตœ์ข…์ ์ธ root๋…ธ๋“œ๊ฐ€ ๋˜๊ณ  ์ถ”ํ›„ ๋น„๊ตํ• ๋•Œ root๋…ธ๋“œ๊ฐ€ ๋™์ผํ•œ์ง€๋งŒ ํ•œ๋ฒˆ ๋น„๊ตํ•˜๋ฉด ๋˜๊ธฐ์— ํƒ์ƒ‰ํšŸ์ˆ˜๋ฅผ ์ค„ ์ผ ์ˆ˜ ์žˆ๋‹ค. ์ด ์ฒ˜๋Ÿผ ํ•œ๋ฒˆ ๊ฑฐ์ฒ˜๊ฐ„ ๋ฃจํŠธ๋ฅผ ๊ฐฑ์‹ ํ•ด ๋ฐ˜๋ณต ํ™•์ธ์„ ์ค„์ด๋Š” ๊ฒƒ์ด path compression์ด๋‹ค.

 

union

์„œํด์„ ์ด๋ฃจ์ง€ ์•Š๋Š”๋‹ค๋ฉด, ์—ฐ๊ฒฐํ•ด์ค„ ๋‹จ๊ณ„

 // union: ๊ฐ„์„ ์„ ์—ฐ๊ฒฐ
    public void union(String nodeS, String nodeE){
        String rootS = find(nodeS);
        String rootE = find(nodeE);

        // union by rank ๊ธฐ๋ฒ•์„ ์ด์šฉ
        if(rank.get(rootS) > rank.get(rootE)){ // ๋žญํฌ๊ฐ€ ๋†’์€ ๊ณณ์— ๋‚ฎ์€ ๋žญํฌ๋ฅผ ์—ฐ๊ฒฐ
            parentNode.put(rootE, rootS);
        } else {
            parentNode.put(rootS, rootE);   // ๋žญํฌ๊ฐ€ ๊ฐ™๋‹ค๋ฉด, ํ•œ์ชฝ์˜ ๋žญํฌ๋ฅผ ์˜ฌ๋ฆฌ๊ณ  ์—ฐ๊ฒฐ
            rank.put(rootE, rank.get(rootE) + 1);
        }
    }

unionํ•˜๋Š” ๊ณผ์ •์—์„œ๋Š” union-by-rank ๊ธฐ๋ฒ•์ด ์‚ฌ์šฉ๋œ๋‹ค.

find๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ํŠธ๋ฆฌ๊ตฌ์กฐ๋กœ node๋ฅผ ์ดํ•ดํ–ˆ๋Š”๋ฐ ์ด๋•Œ ๋…ธ๋“œ๋“ค์˜ ๊นŠ์ด๋ฅผ rank๋กœ ํ‘œ์‹œํ•ด์ค€๋‹ค.

์ฒ˜์Œ node์˜ rank๋Š” 0์œผ๋กœ ์‹œ์ž‘ํ•œ๋‹ค.

node๋ฅผ ์—ฐ๊ฒฐํ•  ๋•Œ ๋žญํฌ๊ฐ€ ๋‚ฎ์€๊ฒƒ์„ ๋†’์€๊ฒƒ ์•„๋ž˜์— ์—ฐ๊ฒฐํ•œ๋‹ค. ๋žญํฌ๊ฐ€ ๊ฐ™๋‹ค๋ฉด ํ•œ์ชฝ์˜ ๋žญํฌ๋ฅผ ๋†’์ด๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

์ตœ์ข… ์ฝ”๋“œ

import java.util.*;

/**
 * ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ(minimum spanning tree) ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜
 * union find ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด์šฉ => ๋ฃจํŠธ ๋…ธ๋“œ๊ฐ€ ๊ฐ™๋‹ค๋ฉด ์ด๋ฏธ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ์ด๋‹ค.
 * union by rank ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด์šฉ => ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋œ ํŠธ๋ฆฌ์˜ ๋†’์ด๋ฅผ ๋žญํฌ๋กœ ๋‹ค๋ฃธ.
 * path compression ์ด์šฉ => ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ํ•œ๋ฒˆ์— ์ฐพ๊ธฐ ์œ„ํ•œ ๊ธฐ๋ฒ•. ํ•œ๋ฒˆ ๊ฑฐ์ณ๊ฐ„ ๋ฃจํŠธ๋ฅผ ๊ฐฑ์‹ (๋ถ€๋ชจ์˜ ๋ถ€๋ชจ๋ฅผ ์ž์‹ ์˜ ๋ฃจํŠธ๋กœ ๊ฐฑ์‹  => ๋ฃจํŠธ๊ฐ€ ๊ฐ™์•„์ง)
 *
 */
public class Kruskal {
    Map<String, String> parentNode = new HashMap<>();   // ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ์ €์žฅ
    Map<String, Integer> rank = new HashMap<>();    // ๋…ธ๋“œ์˜ ๋žญํฌ๋ฅผ ์ €์žฅ

    // ๊ฐ„์„  ๊ฐ์ฒด
    public static class Edge implements Comparable<Edge> {
        int weight; // ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋“ค์˜ ๊ฐ€์ค‘์น˜
        String nodeS;   // ์—ฐ๊ฒฐ๋œ 2๊ฐœ์˜ ๋…ธ๋“œ ์ค‘ ํ•˜๋‚˜
        String nodeE;   // ์—ฐ๊ฒฐ๋œ 2๊ฐœ์˜ ๋…ธ๋“œ ์ค‘ ํ•˜๋‚˜

        // ์ƒ์„ฑ์ž
        public Edge(int weight, String nodeS, String nodeE){
            this.weight = weight;
            this.nodeS = nodeS;
            this.nodeE = nodeE;
        }
        @Override
        public int compareTo(Edge o) {
            return this.weight - o.weight;  // ๊ฐ€์ค‘์น˜๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ
        }
    }

    /**
     * union find ์•Œ๊ณ ๋ฆฌ์ฆ˜
     */
    // find: ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์ฐพ์•„๋‚ด๋Š” ํ•จ์ˆ˜
    public String find(String node) {
        // parh compression ๊ธฐ๋ฒ•์„ ์ด์šฉ(๋ฃจํŠธ๋ฅผ ๊ฐ™๊ฒŒ ๋งŒ๋“ฆ)
        if(parentNode.get(node) != node) {  // ๋ถ€๋ชจ๊ฐ€ ์ž์‹ ๊ณผ ๊ฐ™์ง€ ์•Š๋‹ค๋ฉด, ๋ฃจํŠธ๊ฐ€ ์•„๋‹˜
            parentNode.put(node, find(parentNode.get(node)));   // ์žฌ๊ท€๋ฅผ ํ†ตํ•ด ๋ถ€๋ชจ์˜ ๋ถ€๋ชจ๋กœ ๊ฐฑ์‹  => ๋ฃจํŠธ ๋…ธ๋“œ๊ฐ€ ๊ฐ™์•„์ง
        }
        return parentNode.get(node);    // ์ตœ์ข… ๋ถ€๋ชจ ๋…ธ๋“œ๋Š” ๋ฃจํŠธ
    }

    // union: ๊ฐ„์„ ์„ ์—ฐ๊ฒฐ
    public void union(String nodeS, String nodeE){
        String rootS = find(nodeS);
        String rootE = find(nodeE);

        // union by rank ๊ธฐ๋ฒ•์„ ์ด์šฉ
        if(rank.get(rootS) > rank.get(rootE)){ // ๋žญํฌ๊ฐ€ ๋†’์€ ๊ณณ์— ๋‚ฎ์€ ๋žญํฌ๋ฅผ ์—ฐ๊ฒฐ
            parentNode.put(rootE, rootS);
        } else {
            parentNode.put(rootS, rootE);   // ๋žญํฌ๊ฐ€ ๊ฐ™๋‹ค๋ฉด, ํ•œ์ชฝ์˜ ๋žญํฌ๋ฅผ ์˜ฌ๋ฆฌ๊ณ  ์—ฐ๊ฒฐ
            rank.put(rootE, rank.get(rootE) + 1);
        }
    }

    // ์ดˆ๊ธฐํ™”
    public void init(String node) {
        parentNode.put(node, node); // ๋ถ€๋ชจ๊ฐ€ ์ž์‹ ์ธ ๋…ธ๋“œ๋Š” ๋ฃจํŠธ
        rank.put(node, 0);  // ์ดˆ๊ธฐ ๋žญํฌ๋Š” 0
    }


    public ArrayList<Edge> kruskalFunc(ArrayList<String> vetices, ArrayList<Edge> edgeds) {
        ArrayList<Edge> list = new ArrayList<>();

        // ์ดˆ๊ธฐํ™”
        for(String item : vetices) {
            init(item);
        }

        // ์ •๋ ฌ
        Collections.sort(edgeds);

        // ๊ฐ„์„  ์—ฐ๊ฒฐ
        for(Edge edge : edgeds) {
            if(find(edge.nodeS) != find(edge.nodeE)) {  // ๋ฃจํŠธ ๋…ธ๋“œ๊ฐ€ ๋‹ค๋ฅด๋‹ค๋ฉด ์„œํดํ˜•์„ฑ์„ ํ•˜์ง€์•Š์Œ
                union(edge.nodeS, edge.nodeE);  // ๊ฐ„์„ ์„ ์ฑ„ํƒํ•ด์„œ ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐ
                list.add(edge); // ์ฑ„ํƒํ•œ ๊ฐ„์„ ์„ ๊ฒฐ๊ณผ์— ๋‹ด๊ธฐ
            }
        }

        return list;
    }
}

 

728x90
๋ฐ˜์‘ํ˜•