Dijkstra's Algorithm
๊ทธ๋ํ ์ค์์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์ค์ ํ๋๋ก ํ๋์ ์ ์ ์์ ๋ค๋ฅธ ๋ชจ๋ ์ ์ ๊น์ง์ ์ต๋จ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ (single-source shortest path algorithmm)
์ฐ์ ์์ ํ์ ๋ฐฉ๋ฒ์ ์ด์ฉํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
vertex๋ฅผ ํ๊ฐ์ฉ ์ ํํ๋ฉฐ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ๋ฐฉ๋ฒ.
relax์ ๊ฐ๋
์ ์ด์ฉํ๋ฉฐ relax๋ ํ์ฌ ๊ณ์ฐ๋ v๋
ธ๋๊น์ง์ ๊ฑฐ๋ฆฌ๋ณด๋ค ํ์ฌ ๋
ธ๋ u๊น์ง์ ๊ฒฝ๋ก์ u์์ v์ ๊ฐ์ค์น ( e(u,v) ) ๊ฐ ๋ ์๋ค๋ฉด ๊ฐ์ ๊ฐฑ์ ํด์ฃผ๋ ๊ฒ.
relax๋ prim ์๊ณ ๋ฆฌ์ฆ์ decrease-key์ ์ ์ฌํ๋ฉฐ dp๋ฅผ ์ถ๊ฐํ ๊ฐ๋
ํน์ง
ํ์์ ์ธ ๋ฐฉ๋ฒ( Greedy Method )
์ ์ ์ ํ ๊ธฐ๋ฐ
์์ ๊ฐ์ค์น ํ์ฉ x
์์ ์ ์ ๋ถํฐ ์ถ๋ฐํ์ฌ ์ต์ ๋น์ฉ์ ๊ฐ์ ์ ๊ฐ๋ ์ ์ ์ ์ ํํ์ฌ ์ ์ฅ ํธ๋ฆฌ ์งํฉ์ ๋จ๊ณ์ ์ผ๋ก ํ์ฅ
๋ฐ์ง ๊ทธ๋ํ์ ์ ํฉ
์๋ฃ๊ตฌ์กฐ์ค ํ๋์ธ
์ฐ์ ์์ ํ๋ฅผ ์ด์ฉํ๋ฉฐ, ์ฐ์ ์์ ํ๋ฅผ ์ด๋ป๊ฒ ๊ตฌํํ๋๊ฐ๊ฐ ์๊ฐ๋ณต์ก๋์ ์ํฅ
Pesudo Code
๊ตฌํ ๋ฐฉ๋ฒ
Prim's ์๊ณ ๋ฆฌ์ฆ์์ decrease key ๋ถ๋ถ์ dp๋ฅผ ์ด์ฉํ๋ค๋ ๊ฒ ๋นผ๊ณ ๋ค๋ฅธ ๊ฒ์ด ์๋ค.
vertex๋ค์ key๊ฐ์ Infinity๋ก ์ด๊ธฐํํ๋ค.
start vertex์ key๊ฐ์ 0์ผ๋ก ์ด๊ธฐํํ๋ค. (์ด๋ค vertex๋ฅผ ์ ํํ๋๋ผ๊ณ MST๊ฐ ๋์จ๋ค.)
ํ์ฌ vertex์ ์ธ์ ํ vertex๋ค ์ค ์ ํํ์ง ์์๊ณ , ๊ฐ์ฅ vertex์ key๊ฐ์ด ์์ vertex์ ์ฐพ๋๋ค. (
exract-min = ์ต์๊ฐ ์ถ์ถ)ํ์ฌ vertex๋ฅผ ์ ํํ๋ค.
์ธ์ ํ vertex์ค vertex์ key๊ฐ๋ณด๋ค ๊ฐ์ ์ ๊ฐ์ค์น์ ํ์ฌ๊น์ง์ ๊ฑฐ๋ฆฌ์ ํฉ์ด ๋ ์๋ค๋ฉด key๊ฐ์ ๊ฐ์ค์น์ ํ์ฌ๊น์ง์ ๊ฑฐ๋ฆฌ์ ํฉ์ผ๋ก ๊ฐฑ์ ํ๋ค. (
RELAX)์ธ์ ํ vertex์ค ์ ํํ์ง ์์๊ณ , ๊ฐ์ฅ vertex์ key๊ฐ์ด ์์ vertex๋ฅผ ๊ธฐ์ค์ผ๋ก
3๋ฒ๋ถํฐ ๋ค์ ๋ฐ๋ณตํ๋ค.๋ชจ๋ vertex๊ฐ ์ ํ๋์๋ค๋ฉด ๋๋๋ค.
์ธ์ ํ๋ ฌ
์์ ์ค๋ช
ํ 3๋ฒ ๋ฐฉ๋ฒ์ extract-min์ ์๋์ ๊ฐ์ด ๋ฐฐ์ด๋ก ๊ตฌํํ๋ฉฐ, ๋งค๋ฒ Vํ ๋ฐ๋ณตํ๋ค.
์๋๋ 5๋ฒ ๋ฐฉ๋ฒ์ผ๋ก ์ธ์ ํ vertex์ค vertex์ key๊ฐ๋ณด๋ค ๊ฐ์ ์ ๊ฐ์ค์น์ ํ์ฌ๊น์ง์ ๊ฑฐ๋ฆฌ์ ํฉ์ด ๋ ์๋ค๋ฉด key๊ฐ์ ๊ฐ์ค์น์ ํ์ฌ๊น์ง์ ๊ฑฐ๋ฆฌ์ ํฉ์ผ๋ก ๊ฐฑ์ ํ๋ค.
์ ๋ณด๋ฉด ์๊ฒ ์ง๋ง Prim's ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋น๊ตํด์ vertex_key[selct_idx]์ถ๊ฐ ๋์๋ค.
์ธ์ ๋ฆฌ์คํธ
์ธ์ ๋ฆฌ์คํธ๋ ์ธ์ ํ vertex์ ๊ฐ์ค์น๋ฅผ priority queue๋ฅผ ํตํด ์ ์ฅํ๋ค.
๋๋ฌธ์, 3๋ฒ ๋ฐฉ๋ฒ์ exract-min์ ๋งจ์์์ pop์ ์์ผ ์ฐพ์์ฃผ๋ฉด ๋๋ค.
5๋ฒ ๋ฐฉ๋ฒ์ผ๋ก ์ธ์ ํ vertex์ค vertex์ key๊ฐ๋ณด๋ค ๊ฐ์ ์ ๊ฐ์ค์น์ ํ์ฌ ์ ์ ๊น์ง์ ๊ฑฐ๋ฆฌ์ ํฉ์ด ๋ ์๋ค๋ฉด key๊ฐ์ ๊ฐ์ค์น์ ํ์ฌ ์ ์ ๊น์ง์ ๊ฑฐ๋ฆฌ์ ํฉ์ผ๋ก ๊ฐฑ์ ํ๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ์ด ์ธ์ ํ ๊ฐ์ ์ ๊ฐ์๋งํผ ์ํํ๋ค.
์๊ฐ ๋ณต์ก๋
Prim's ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋์ผํ๋ค.
์๊ฐ๋ณต์ก๋๋ ์ด๊ธฐํํ๋๋ฐ O(|V|), MST๊ณ์ฐํ๋๋ฐ O(|V|) * T(extract-min) (๊ฐ์ฅ ์ ์ ๊ฐ ์ถ์ถํ๋๋ฐ ๊ฑธ๋ฆฐ์๊ฐ) + O(|E|) * T(RELAX) ( key๊ฐ ๋ณ๊ฒฝํ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ )์ ๊ฐ๋ค.
๋ฐ๋ผ์, priority-queue๋ฅผ ์ด๋ป๊ฒ ๊ตฌํํ๋์ง์ ๋ฐ๋ผ ์๊ฐ๋ณต์ก๋๊ฐ ๋ฌ๋ผ์ง๋ค.
์ผ๋ฐ ๋ฐฐ์ด๋ก ๊ตฌํํ์ ๊ฒฝ์ฐ T(extract)๊ฐ O(|V|), T(RELAX)๋ O(1)๋งํผ ๊ฑธ๋ ค ์ด O(|V^2|)์ด ๊ฑธ๋ฆฐ๋ค.
binary heap(์ด์ง ํ)์ผ๋ก ๊ตฌํํ๋ฉด T(extract)๊ฐ O(lgV), T(RELAX)๋ O(lgV)๋งํผ ๊ฑธ๋ ค ์ด O(VlgV) + O(ElgV) ์ด๊ธฐ ๋๋ฌธ์ O((E+V)lgV)๋งํผ ๊ฑธ๋ฆฐ๋ค. ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ์ผ๋ E์ ์ต์๊ฐ์ V-1๋ก ๊ฑฐ์ ๋๋ถ๋ถ์ด |E| > |V| ์ด๋ฏ๋ก O(|E|lg|V|)๋ผ๊ณ ํ ์ ์๋ค.
priority queue๋ฅผ ์ด์ง ํ์ด ์๋ fibonacci heap์ผ๋ก ๊ตฌํํ๋ฉด RELAX์ ์๊ฐ์ ์ข๋ ์ค์ผ ์ ์๋ค. RELAX์๊ฐ์ด O(1)๋งํผ ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์ O(E+VlgV)๋ผ๊ณ ํ ์ ์๋ค. O(E) or O(VlgV) ์ธ ์ด์ ๋ ์ต์ ์ ๊ฒฝ์ฐ์ E๋ O(V^2)์ด๊ธฐ ๋๋ฌธ์ด๋ค.
๊ตฌํ ์ฝ๋
์๋ ์ฝ๋๋ ์ฌ์ดํด์ด์๋ ๋ฌด๋ฐฉํฅ์ ๊ทธ๋ํ์ด๊ณ , ๊ฐ์ค์น๋ฅผ ๋ฌด์์๋ก ์์ฑํ ๊ทธ๋ํ์ด๋ค.
์์ค์ฝ๋ c++ ( ์ ๊ธฐ / ํผ์น๊ธฐ )
Last updated