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);
๊ตฌํ ๋ฐฉ๋ฒ
vertex๋ค์ key๊ฐ์ Infinity๋ก ์ด๊ธฐํํ๋ค.
start vertex์ key๊ฐ์ 0์ผ๋ก ์ด๊ธฐํํ๋ค. (์ด๋ค vertex๋ฅผ ์ ํํ๋๋ผ๊ณ MST๊ฐ ๋์จ๋ค.)
ํ์ฌ vertex์ ์ธ์ ํ vertex๋ค ์ค ์ ํํ์ง ์์๊ณ , ๊ฐ์ฅ vertex์ key๊ฐ์ด ์์ vertex์ ์ฐพ๋๋ค. (
exract-min = ์ต์๊ฐ ์ถ์ถ)ํ์ฌ vertex๋ฅผ ์ ํํ๋ค.
์ธ์ ํ vertex์ค vertex์ key๊ฐ๋ณด๋ค ๊ฐ์ ์ ๊ฐ์ค์น๊ฐ ๋ ์๋ค๋ฉด key๊ฐ์ ๊ฐ์ค์น๋ก ๊ฐฑ์ ํ๋ค. (
decrease -key)์ธ์ ํ vertex์ค ์ ํํ์ง ์์๊ณ , ๊ฐ์ฅ vertex์ key๊ฐ์ด ์์ vertex๋ฅผ ๊ธฐ์ค์ผ๋ก
3๋ฒ๋ถํฐ ๋ค์ ๋ฐ๋ณตํ๋ค.๋ชจ๋ 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