๐ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ (Dijkstra)
ํน์ ๋ ธ๋์์ ๋ค๋ฅธ ๋ชจ๋ ๋ ธ๋๋ก ํฅํ๋ ์ต๋or์ต์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ (์์ ๊ฐ์ ์ ์ฌ์ฉ ๋ถ๊ฐ๋ฅ)
(Greedy & DP)
โ ๋์
- ์ ๊ณต๋ ๊ฑฐ๋ฆฌ ์ ๋ณด๋ก ์ธ์ ๋ฆฌ์คํธ or ์ธ์ ํ๋ ฌ ์์ฑ
- ๋ค๋ฅธ ๋ชจ๋ ๋
ธ๋๋ก ํฅํ๋ ์ต๋ or ์ต์ ๊ฒฝ๋ก๋ฅผ ์ ์ฅํ๋ dp๋ฅผ ํ๋ ์ ์ธ
(dp ์ ์ฒด๋ฅผ MAX_VALUE๋ก ์ด๊ธฐํ, ์์ ๋ ธ๋๋ cost = 0์ผ๋ก ์ค์ ) - ์ฐ์ ์์ํ๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ฅ ๊ฑฐ๋ฆฌ๊ฐ ์งง์ ๊ฒ ๋จผ์ ํ์
- ๊ฐ์ ๊บผ๋๋๋ฐ, ์ด๋ฏธ ๋ ์์ ๊ฐ์ผ๋ก ๊ฐฑ์ ๋์ด ์๋ ๊ฒฝ์ฐ
⇒ ๊ฐ์ ์๋ก ๊ฐฑ์ ํ ํ์ ์์ (continue) - ๊บผ๋ธ ๋
ธ๋์ ์ฐ๊ฒฐ๋์ด ์๋ ๋
ธ๋๋ค์ ์์ฐจ์ ์ผ๋ก ํ์
⇒ ์๋ก updateํ ๊ฑฐ๋ฆฌ๊ฐ dp์ ์ ์ฅ๋ ๊ฑฐ๋ฆฌ๋ณด๋ค ํฐ ๊ฒฝ์ฐ, update X & ์ฐ์ ์์ ํ์ ์๋ก ์ ์ฅ X
- ๊ฐ์ ๊บผ๋๋๋ฐ, ์ด๋ฏธ ๋ ์์ ๊ฐ์ผ๋ก ๊ฐฑ์ ๋์ด ์๋ ๊ฒฝ์ฐ
โฐ ์๊ฐ ๋ณต์ก๋
์ฐ์ ์์ ํ ์ฌ์ฉ : O(ElogV)
๊ฐ์ ์ ๊ฐฏ์๋ฅผ E๊ฐ, ๋ ธ๋์ ๊ฐฏ์๋ฅผ V๊ฐ ๋ผ๊ณ ํ์. ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ E๊ฐ์ ๊ฐ์ ์ ์ฐ์ ์์ ํ์ ๋ฃ์๋ค๊ฐ ๋นผ๋ ์ฐ์ฐ์ด๋ค. ๋ชจ๋ ๊ฐ์ ์ด ํ๋ฒ์ฉ ๊ฒ์ฌ๋๋ค๋ ์ ์์ O(E)๋ฒ ๋ฐ๋ณตํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ ๊ฐ์ ๋ง๋ค ์ฐ์ ์์ ํ์์ add&poll ์ฐ์ฐ์ด ์ผ์ด๋๋๋ฐ, ๊ทธ๋ํ์ ์ค๋ณต ๊ฐ์ ์ด ์๋ค๋ฉด E๋ V^2 ์ดํ์ด๋ค. ์๋ํ๋ฉด ๋ชจ๋ ๋ ธ๋๊ฐ ์ฐ๊ฒฐ๋ ๊ฒฝ์ฐ ๊ฐ์ ์ ๊ฐฏ์๋ V(V-1)๊ฐ ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ ํ๋์ ๊ฐ์ ์์ ์ฐ์ ์์ ํ์ add&pollํ๋ ์ฐ์ฐ์ ์ต์ ์ ๊ฒฝ์ฐ O(logV) ์ด๋ฏ๋ก, ์ ์ฒด ๊ฐ์ E๊ฐ์์ ์ฐ์ ์์ ํ ์ฐ์ฐ์ ํ๋ฉด "O(ElogV)"๊ฐ ์์๋๋ค.
๐ฃ๏ธ ์ฝ๋
๋ฐฑ์ค 1504, 1753
(๋ง์ฝ ๊ณต๊ฐ ๋ณต์ก๋๊ฐ ๋๋ํ์ง ์๋ค๋ฉด ์ธ์ ๋ฆฌ์คํธ๋ฅผ ํ์ฉํ์ฌ ๊ทธ๋ํ๋ฅผ ์ด๊ธฐํํ๋ค.)
// ์ต๋จ ๊ฒฝ๋ก ์ฐพ๊ธฐ
private static int[] dijkstra(int start){
// 2. ๊ฑฐ๋ฆฌ์ ์ต์๊ฐ์ ์ ์ฅํ๋ DP ์ ์ธ
int cost[] = new int[n+1];
Arrays.fill(cost, MAX_VALUE);
cost[start] = 0;
// 3. ์ฐ์ ์์ํ๋ฅผ ์ฌ์ฉํด์ cost๊ฐ ๊ฐ์ฅ ์ ์ ๊ฒ์ ๋จผ์ ํ์
PriorityQueue<Pair> queue = new PriorityQueue<>((p1, p2) -> (p1.cost - p2.cost));
queue.add(new Pair(0, start));
while(!queue.isEmpty()){
Pair p = queue.poll();
// 3-1. ์ด๋ฏธ ๋ ์์ ๊ฐ์ผ๋ก ๊ฐฑ์ ๋์ด ์๋ ๊ฒฝ์ฐ (๋ ํ์ธํ์ง ์๊ณ ๋ค์์ผ๋ก ๋์ด๊ฐ)
if(p.cost > cost[p.node]){
continue;
}
for(int i=1; i<=n; i++){
if(arr[p.node][i] != 0){
// 3-2. ์
๋ฐ์ดํธ ํ ์ง ๋ง์ง ๊ฒฐ์
if(arr[p.node][i] + p.cost < cost[i]){
cost[i] = arr[p.node][i] + p.cost;
queue.add(new Pair(cost[i], i));
}
}
}
}
return cost;
}