Prim's Algorithm

์šฐ์„ ์ˆœ์œ„ ํ์˜ ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

vertex๋ฅผ ํ•œ๊ฐœ์”ฉ ์„ ํƒํ•˜๋ฉฐ ์ตœ์†Œ ๋น„์šฉ์˜ edge๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•.

decrease-key์˜ ๊ฐœ๋…์„ ์ด์šฉํ•˜๋ฉฐ decrease-key๋Š” ํ˜„์žฌ ๊ณ„์‚ฐ๋œ v๋…ธ๋“œ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋ณด๋‹ค ํ˜„์žฌ ๋…ธ๋“œ u๋ถ€ํ„ฐ v๊นŒ์ง€์˜ ๊ฒฝ๋กœ๊ฐ€ ๋” ์ž‘๋‹ค๋ฉด ๊ฐ’์„ ๊ฐฑ์‹ ํ•ด์ฃผ๋Š” ๊ฒƒ.

ํŠน์ง•

  • ์ •์  ์„ ํƒ ๊ธฐ๋ฐ˜

  • ์‹œ์ž‘ ์ •์ ๋ถ€ํ„ฐ ์ถœ๋ฐœํ•˜์—ฌ ํ•ด๋‹น ๋…ธ๋“œ๊นŒ์ง€์˜ ์ตœ์†Œ ๋น„์šฉ์„ ๊ธฐ๋กํ•˜๋Š” ๋ฐฐ์—ด์„ ์ด์šฉํ•˜์—ฌ ๊ตฌํ•˜๋Š” ๋ฐฉ์‹

  • ์ž๋ฃŒ๊ตฌ์กฐ์ค‘ ํ•˜๋‚˜์ธ ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์ด์šฉํ•˜๋ฉฐ, ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ–ˆ๋Š”๊ฐ€๊ฐ€ ์‹œ๊ฐ„๋ณต์žก๋„์— ์˜ํ–ฅ

Pesudo Code

MST-Prim(G, w, r)
    Q = V[G];
    for each u โˆˆ Q
        key[u] = INFINITY;
    key[r] = 0;
    p[r] = NULL;
    while (Q not empty)
        u = ExtractMin(Q);
        for each v โˆˆ Adj[u]
            if (v โˆˆ Q and w(u,v) < key[v])  //Decrease-key
                p[v] = u;
                key[v] = w(u,v);

๊ตฌํ˜„ ๋ฐฉ๋ฒ•

  1. vertex๋“ค์˜ key๊ฐ’์„ Infinity๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.

  2. start vertex์˜ key๊ฐ’์„ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค. (์–ด๋–ค vertex๋ฅผ ์„ ํƒํ•˜๋”๋ผ๊ณ  MST๊ฐ€ ๋‚˜์˜จ๋‹ค.)

  3. ํ˜„์žฌ vertex์— ์ธ์ ‘ํ•œ vertex๋“ค ์ค‘ ์„ ํƒํ•˜์ง€ ์•Š์•˜๊ณ , ๊ฐ€์žฅ vertex์˜ key๊ฐ’์ด ์ž‘์€ vertex์„ ์ฐพ๋Š”๋‹ค. (exract-min = ์ตœ์†Œ๊ฐ’ ์ถ”์ถœ)

  4. ํ˜„์žฌ vertex๋ฅผ ์„ ํƒํ•œ๋‹ค.

  5. ์ธ์ ‘ํ•œ vertex์ค‘ vertex์˜ key๊ฐ’๋ณด๋‹ค ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜๊ฐ€ ๋” ์ž‘๋‹ค๋ฉด key๊ฐ’์„ ๊ฐ€์ค‘์น˜๋กœ ๊ฐฑ์‹  ํ•œ๋‹ค. (decrease -key)

  6. ์ธ์ ‘ํ•œ vertex์ค‘ ์„ ํƒํ•˜์ง€ ์•Š์•˜๊ณ , ๊ฐ€์žฅ vertex์˜ key๊ฐ’์ด ์ž‘์€ vertex๋ฅผ ๊ธฐ์ค€์œผ๋กœ 3๋ฒˆ๋ถ€ํ„ฐ ๋‹ค์‹œ ๋ฐ˜๋ณตํ•œ๋‹ค.

  7. ๋ชจ๋“  vertex๊ฐ€ ์„ ํƒ๋˜์—ˆ๋‹ค๋ฉด ๋๋‚œ๋‹ค.

์ธ์ ‘ ํ–‰๋ ฌ


์œ„์— ์„ค๋ช…ํ•œ 3๋ฒˆ ๋ฐฉ๋ฒ•์˜ extract-min์„ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฐฐ์—ด๋กœ ๊ตฌํ˜„ํ•˜๋ฉฐ, ๋งค๋ฒˆ VํšŒ ๋ฐ˜๋ณตํ•œ๋‹ค.

์•„๋ž˜๋Š” 5๋ฒˆ ๋ฐฉ๋ฒ•์œผ๋กœ ์ธ์ ‘ํ•œ vertex์ค‘ vertex์˜ key๊ฐ’๋ณด๋‹ค ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜๊ฐ€ ๋” ์ž‘๋‹ค๋ฉด key๊ฐ’์„ ๊ฐ€์ค‘์น˜๋กœ ๊ฐฑ์‹  ํ•œ๋‹ค.

์ธ์ ‘ ๋ฆฌ์ŠคํŠธ


์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋Š” ์ธ์ ‘ํ•œ vertex์˜ ๊ฐ€์ค‘์น˜๋ฅผ priority queue๋ฅผ ํ†ตํ•ด ์ €์žฅํ•œ๋‹ค.

๋•Œ๋ฌธ์—, 3๋ฒˆ ๋ฐฉ๋ฒ•์˜ exract-min์€ ๋งจ์•ž์—์„œ pop์„ ์‹œ์ผœ ์ฐพ์•„์ฃผ๋ฉด ๋œ๋‹ค.

5๋ฒˆ ๋ฐฉ๋ฒ•์œผ๋กœ ์ธ์ ‘ํ•œ vertex์ค‘ vertex์˜ key๊ฐ’๋ณด๋‹ค ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜๊ฐ€ ๋” ์ž‘๋‹ค๋ฉด key๊ฐ’์„ ๊ฐ€์ค‘์น˜๋กœ ๊ฐฑ์‹  ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™์ด ์ธ์ ‘ํ•œ ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜๋งŒํผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์‹œ๊ฐ„ ๋ณต์žก๋„

์‹œ๊ฐ„๋ณต์žก๋„๋Š” ์ดˆ๊ธฐํ™”ํ•˜๋Š”๋ฐ O(|V|), MST๊ณ„์‚ฐํ•˜๋Š”๋ฐ O(|V|) * T(extract-min) (๊ฐ€์žฅ ์ ์€ ๊ฐ’ ์ถ”์ถœํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฐ์‹œ๊ฐ„) + O(|E|) * T(decrease-key) ( key๊ฐ’ ๋ณ€๊ฒฝํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„ )์™€ ๊ฐ™๋‹ค.

๋”ฐ๋ผ์„œ, priority-queue๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ–ˆ๋Š”์ง€์— ๋”ฐ๋ผ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค.

์ผ๋ฐ˜ ๋ฐฐ์—ด๋กœ ๊ตฌํ˜„ํ–ˆ์„ ๊ฒฝ์šฐ T(extract)๊ฐ€ O(|V|), T(decrease)๋Š” O(1)๋งŒํผ ๊ฑธ๋ ค ์ด O(|V^2|)์ด ๊ฑธ๋ฆฐ๋‹ค.

binary heap(์ด์ง„ ํž™)์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด T(extract)๊ฐ€ O(lgV), T(decrease)๋Š” O(lgV)๋งŒํผ ๊ฑธ๋ ค ์ด O(VlgV) + O(ElgV) ์ด๊ธฐ ๋•Œ๋ฌธ์— O((E+V)lgV)๋งŒํผ ๊ฑธ๋ฆฐ๋‹ค. ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์ผ๋•Œ E์˜ ์ตœ์†Œ๊ฐ’์€ V-1๋กœ ๊ฑฐ์˜ ๋Œ€๋ถ€๋ถ„์ด |E| > |V| ์ด๋ฏ€๋กœ O(|E|lg|V|)๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

priority queue๋ฅผ ์ด์ง„ ํž™์ด ์•„๋‹Œ fibonacci heap์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด decrease-key์˜ ์‹œ๊ฐ„์„ ์ข€๋” ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. decrease-key์‹œ๊ฐ„์ด O(1)๋งŒํผ ๊ฑธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— O(E+VlgV)๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. O(E) or O(VlgV) ์ธ ์ด์œ ๋Š” ์ตœ์•…์˜ ๊ฒฝ์šฐ์— E๋Š” O(V^2)์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ตฌํ˜„ ์ฝ”๋“œ

์•„๋ž˜ ์ฝ”๋“œ๋Š” ์‚ฌ์ดํด์ด์—†๋Š” ๋ฌด๋ฐฉํ–ฅ์˜ ๊ทธ๋ž˜ํ”„์ด๊ณ , ๊ฐ€์ค‘์น˜๋ฅผ ๋ฌด์ž‘์œ„๋กœ ์ƒ์„ฑํ•œ ๊ทธ๋ž˜ํ”„์ด๋‹ค.

์†Œ์Šค์ฝ”๋“œ c++ ( ์ ‘๊ธฐ / ํŽผ์น˜๊ธฐ )

Last updated