์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ - ๋ค์ต์คํธ๋ผ(Dijkstra) ์๊ณ ๋ฆฌ์ฆ
์ต๋จ ๊ฒฝ๋ก๋?
๊ฐ์ ์ ๊ฐ์ค์น๊ฐ ์๋ ๊ทธ๋ํ์์ ๋ ์ ์ ์ฌ์ด ๊ฒฝ๋ก๋ค ์ค ๊ฐ์ ์ ๊ฐ์ค์น ํฉ์ด ์ต์์ธ ๊ฒฝ๋ก
ํ๋์ ์์ ์ ์ ์์ ๋ ์ ์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก๋ ๋ค์ต์คํธ๋ผ(Dijkstra) ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋ฒจ๋ง-ํฌ๋(Bellman-Ford) ์๊ณ ๋ฆฌ์ฆ์ด ์์
๋ชจ๋ ์ ์ ๋ค์ ๋ํ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก๋ ํ๋ก์ด๋-์์ฌ(Floyd-Warshall) ์๊ณ ๋ฆฌ์ฆ์ด ์์
- ๊ฐ์ค์น๊ฐ ์๋ ๊ทธ๋ํ์ ํ์์ผ๋ก๋ DFS, BFS ๋ฐฉ๋ฒ์ด ์กด์ฌํ๋ค.
- ๊ทธ ์ค ๋ ์ ์ ์ฌ์ด ๊ฒฝ๋ก ์ค ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๊ธฐ ์ํด์๋ BFS๋ฅผ ์ด์ฉํ ์ ์๋ค.
- ๊ฐ์ค์น๊ฐ ์๋ ๊ทธ๋ํ์์ ์ต๋จ๊ฒฝ๋ก๋ ๋ค์ ๋งํด ์ต์ ๊ฐ์ ๊ฐ์๋ฅผ ๊ตฌํ๊ธฐ ๋๋ฌธ!
๋ค์ต์คํธ๋ผ(Dijkstra) ์๊ณ ๋ฆฌ์ฆ
- ์์ ์ ์ ์์ ๊ฐ ์ ์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ ๋ฐ์ดํธ ํด๋๊ฐ๋ฉฐ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๋์ถ
- ํ์(๊ทธ๋ฆฌ๋) ์๊ณ ๋ฆฌ์ฆ - ์ถ๋ฐ์ง์์ ํ๋ฒ ๊ฒฝ์ ์ง๊ฐ ์ ํ๋๋ฉด ํด๋น ๊ฒฝ์ ์ง๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ๋์ถ๋ ๊ฒ์ผ๋ก ๋ด. ๋ฐ๋ผ์ ์ด๋ฏธ ๊ฒฝ์ ์ง๋ก ์ ํ๋ ์ ์ ์ ๊ฒฝ๋ก๋ฅผ ๋ค์ ๋๋์๋ณด์ง ์์
- ์ถ๋ฐ์ง์์ ๋์ฐฉ์ง๊น์ง ์ง์ ๋น์ฉ, ๊ฒฝ์ ๋น์ฉ ๋ชจ๋ ๋น๊ตํด ์ต์์ธ ๊ฒฝ๋ก๊ฐ ์ฑํ๋จ
- ๋ฐ๋ผ์ ๊ฐ์ ๊ฐ์๋ฅผ ์ต์ํํ์ฌ ๋์ฐฉํ๋ ๊ฒ์ด ์๋๋ผ ๊ฐ์ ๊ฐ์ค์น๋ฅผ ์ต์ํํ์ฌ ๋์ฐฉํ๊ฒ ๋จ
- ์์ ๊ฐ์ค์น๋ ํ์ฉํ์ง ์์(๋ฒจ๋ง-ํฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์์ ๊ฐ์ค์น๋ ํ์ฉํจ)
- O(N^3)์ ์๊ฐ๋ณต์ก๋๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐ
๋ก์ง ๐ก
- ์์ ์ ์ ์์ ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ์ ์ ์ค ๊ฐ์ฅ ๊ฐ๊น์ด ์ ์ ์ ๋ฐฉ๋ฌธํ๊ณ , ์ด๋ฅผ ๊ฒฝ์ ์ง๋ก ์ฑํ
- ๊ฒฝ์ ์ง๊ฐ ์ ํ๋๋ค๋ฉด ๊ฒฝ์ ์ง์์ ์ธ์ ํ๊ณ ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ์ ์ ์ค, ํ์ฌ ์ฑํ๋ ๊ฒฝ์ ์ง๋ฅผ ๊ฑฐ์ณ์ ๋์ฐฉํ๋ฉด ๋ ๋นจ๋ฆฌ ๋์ฐฉํ ์ ์๋ ์ ์ ์ ๋ํด ์ต๋จ ๊ฒฝ๋ก ์ ๋ฐ์ดํธ
public void Dijkstra {
int V; // ์ ์ ๊ฐ์
int[][] adjMatrix; // ์ธ์ ํ ์ ์ ๊ฐ ๊ฐ์ค์น ์ ์ฅํ ๋ฐฐ์ด
int[] distance; // start ์์ ์์ ์ผ๋ก ์ค๋ ์ต์ ๋น์ฉ, S~v (๋ค๋ฅธ ์ ์ ์ ์ฌ๋ฌ๊ฐ ๊ฑฐ์น ์๋, ์๋ ์๋ ์์)
boolean[] visited; // ๊ฒฝ์ ์ง๋ก ๊ณ ๋ คํด๋ณธ ์ ์ ์ธ์ง๋ฅผ ์ ์ฅ
int start, end; // ์์์ ์ ๊ณผ ๋์ฐฉ์ ์
distance[start] = 0; // ์ถ๋ฐ์ง์์ ์ถ๋ฐ์ง๊น์ง ๊ฑฐ๋ฆฌ 0์ผ๋ก ์ด๊ธฐํ
// ์ ์ ๊ฐ์๋งํผ ๋ฐ๋ณตํ๋ฉฐ ์ ์ ๋ณ ์ต๋จ๊ฑฐ๋ฆฌ ์ฑ์๊ฐ
for (int i=0; i<V; i++) {
// 1) ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ์ ์ ์ค, ์ถ๋ฐ์ง๋ก๋ถํฐ ๊ฐ์ฅ ๊ฐ๊น์ด ์ ์ ์ ๊ฒฝ์ ์ง๋ก ์ ํ
int min = Integer.MAX_VALUE;
int stopOver = 0;
for (int j=0; j<V; j++) {
if (!visited[j] && distance[j] < min) { // distance ๋ฐฐ์ด์ ์ต์๊ฐ์ ์ฐพ๊ธฐ
min = distance[j];
stopOver = j; // ๊ฒฝ์ ์ง๋ก ์ ํ
}
}
visited[stopOver] = true;
// 2) ์์์ ์ ํ๋ ๊ฒฝ์ ์ง์ ์ธ์ ํ ์ ์ ์ค, ํด๋น ๊ฒฝ์ ์ง๋ฅผ ๊ฑฐ์ณ์ ๊ฐ๋ฉด ๋ ์ต๋จ์ผ๋ก ๊ฐ ์ ์๋ ๊ฒฝ๋ก์ ๊ฑฐ๋ฆฌ๋ฅผ ์
๋ฐ์ดํธ
for (int j=0; j<V; j++) {
if (!visited[j] && min+adjMatrix[stopOver][j] != 0 && min+adjMatrix[stopOver][j] < distance[j]) { // ์์ง ๋ฐฉ๋ฌธํ์ง ์๊ณ , ๊ฒฝ์ ์ง์ ์ธ์ ํ๋ฉฐ, ๊ฒฝ์ ์ง๋ฅผ ๊ฑฐ์ณ๊ฐ๋ฉด ๋ ๋นจ๋ฆฌ ๋์ฐฉํ ์ ์์ผ๋ฉด
distance[j] = min+adjMatrix[stopOver][j]; // ์ต๋จ ๊ฒฝ๋ก ๊ฐฑ์
}
}
}
System.out.println(distance[end]); // ์ต์ข
๋์ฐฉ์ง๊น์ง์ ์ต๋จ ๊ฒฝ๋ก ์ถ๋ ฅ
}
์์ฉ
๊ฒฝ๋ก ์ฐ์ด๋ณด๊ธฐ
- ํน์ ์ ์ ์ distance ๋ฐฐ์ด์ ์ ๋ฐ์ดํธํ ๊ฒฝ์ ์ง๊ฐ ์ง์ ์ ์ ์ด ๋จ. ๋ฐ๋ผ์ ์ง์ ์ ์ ์ ๊ธฐ์ตํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํ
- stack ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ๊ฑฐ๋
StringBuilder
์ ์ฐจ๊ณก์ฐจ๊ณก ์ ์ฅํ ์ ์์
์ต์ ํ
-
์ธ์ ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํ ์ต์ ํ
- ๊ทธ๋ํ๋ฅผ ์ธ์ ํ๋ ฌ๋ก ํํํ ๊ฒฝ์ฐ ์ฐ์ฐ ํ์๋
O(2V^2)
๋ฒ - ๊ทธ๋ํ๋ฅผ ์ธ์ ๋ฆฌ์คํธ๋ก ํํํ ๊ฒฝ์ฐ ์ฐ์ฐ ํ์๋
O(V^2 + E)
๋ฒ - ๋ฐ๋ผ์ ๋ณ๋์ ์ต์ ํ ์๊ณ ๋ฆฌ์ฆ ์์ด๋ ๊ฐ์ ์ ํฌ๊ธฐ๋ฅผ ๊ณ ๋ คํ์ฌ ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์ธ์ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํจ์จ์ ์
- ๋จ, ์์ ๊ทธ๋ํ์ ๊ฒฝ์ฐ์๋
E
๊ฐ ๊ฑฐ์V^2
์ ๊ฐ๊น์ ์ง๋ฏ๋ก(์ ํํ๊ฒ๋V(V-1)/2
) ์ธ์ ๋ฆฌ์คํธ๋ ์ธ์ ํ๋ ฌ์ด๋ ๋น์ทํด์ง - ๊ฐ์ ์ด ๋ง์ง ์์ ๋ ์ ๋ฆฌํจ!
- ๊ทธ๋ํ๋ฅผ ์ธ์ ํ๋ ฌ๋ก ํํํ ๊ฒฝ์ฐ ์ฐ์ฐ ํ์๋
-
์ฐ์ ์์ ํ(์ต์ํ)๋ฅผ ์ด์ฉํ ์ต์ ํ
- ๋ค์ต์คํธ๋ผ ๋ก์ง ์ค 2๋ฒ ๋ก์ง์ ๊ฒฝ์ฐ ์ต์ ํ๊ฐ ๋ถ๊ฐ๋ฅํ์ง๋ง 1๋ฒ ๋ก์ง์ ์ฐ์ ์์ ํ๋ฅผ ์ด์ฉํด ๊ฐ์ ๊ฐ๋ฅํจ
- 2)๋ฒ ๋ก์ง์์ ์ต๋จ ๊ฒฝ๋ก๊ฐ ๊ฐฑ์ ๋ ๋ชจ๋ ๊ฐ์ ์ ๋ณด(์ ์ ๊ณผ ๊ฐ์ค์น)๋ฅผ ์ฐ์ ์์ ํ์ ์ฝ์ -> ์์ฒด์ ์ผ๋ก ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋ ์ํ๋ก ์ ์ง
- 1)๋ฒ ๋ก์ง์์๋ ์ถ๋ฐ์ง๋ก๋ถํฐ ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ์ ์ ์ค ์ฐ์ ์์ ํ์์
poll()
ํ์ฌ ์ป์ ์ ์๋ ์ ์ ์ ๊ฒฝ์ ์ง๋ก ์ ํํ๋ค๋ฉด ๊ฐ์ฅ ๊ฐ๊น์ด ๊ฒฝ์ ์ง๋ฅผ ์ฝ๊ฒ ์ฐพ์ ์ ์์!! - 1)๋ฒ ๋ก์ง ์ฐ์ฐ ํ์๋ ๋๋ต
VlogV
, 2๋ฒ ๋ก์ง ์ฐ์ฐ ํ์๋ ๋๋ตElogV
์ด๋ฏ๋ก ์ด(V+E)logV
๋ฒ์ ์ฐ์ฐ๋ง ์ํ๋จ - ํ์ง๋ง ์ด ์ญ์ ์์ ๊ทธ๋ํ์ ์ ์ฃผ๋ ํผํ ์ ์๋๋ฐ, ์์ ๊ทธ๋ํ์์์ ์ฐ์ฐ์
(V+V^2)logV
๋ฒ ์ํ๋๋ฏ๋ก ์ต์ ํ๋ฅผ ํ์ง ์์์ ๋๋ ๋น์ทํด์ง ์ ์๋ค.
๐ ์ต์ํ
- ์์ ์ด์ง ํธ๋ฆฌ
- ํธ๋ฆฌ์ ๋งจ ๋ท๋จ์ ์์๋ฅผ ์ฝ์ ํ ๊ฒฝ์ฐ ์์ ๋ ธ๋๋ ์กฐ์ ๋ ธ๋์ ๋น๊ตํด๊ฐ๋ฉฐ ์์ ์ ์์น๋ฅผ ์ฐพ์
- ํธ๋ฆฌ์ ๋ฃจํธ ์์๋ฅผ ์ญ์ ํ ๊ฒฝ์ฐ ๋งจ ๋ท๋จ์ ์์๊ฐ ๋ฃจํธ ๋ ธ๋๋ก ์ด๋ํ ๋ค, ์์ ๋ ธ๋์ ๋น๊ตํด๊ฐ๋ฉฐ ์์ ์ ์์น๋ฅผ ์ฐพ์
- ๊ฐ์ ์ฝ์
ํ๊ณ ์ญ์ ํ ๋ ์ค์ง
logN
๋ฒ์ ์ฐ์ฐ๋ง ์์๋จ -> ๋งค์ฐ ํจ์จ์ !
public class Dijkstra_PQ {
class Vertex implements Comparable {
int no, distance;
public Vertex(int no, int distance) {
super();
this.no = no;
this.distance = distance;
}
@Override
public int compareTo(Vertex o) {
return this.distance - o.distance;
}
}
public void Dijkstra {
int V; // ์ ์ ๊ฐ์
int[][] adjMatrix; // ์ธ์ ํ ์ ์ ๊ฐ ๊ฐ์ค์น ์ ์ฅํ ๋ฐฐ์ด
int distance; // start ์์ ์์ ์ผ๋ก ์ค๋ ์ต์ ๋น์ฉ, S~v (๋ค๋ฅธ ์ ์ ์ ์ฌ๋ฌ๊ฐ ๊ฑฐ์น ์๋, ์๋ ์๋ ์์)
boolean[] visited; // ๊ฒฝ์ ์ง๋ก ๊ณ ๋ คํด๋ณธ ์ ์ ์ธ์ง๋ฅผ ์ ์ฅ
int start, end; // ์์์ ์ ๊ณผ ๋์ฐฉ์ ์
distance[start] = 0; // ์ถ๋ฐ์ง์์ ์ถ๋ฐ์ง๊น์ง ๊ฑฐ๋ฆฌ 0์ผ๋ก ์ด๊ธฐํ
PriorityQueue<Vertex> pq = newPriorityQueue<>();
pq.offer(new Vertex(start, distance[start])); // ์ต์ด์๋ ์ถ๋ฐ์ง๋ฅผ ํ์ ์ฝ์
while(!pq.isEmpty()) {
// 1) ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ์ ์ ์ค, ์ถ๋ฐ์ง๋ก๋ถํฐ ๊ฐ์ฅ ๊ฐ๊น์ด ์ ์ ์ ๊ฒฝ์ ์ง๋ก ์ ํ
Vertex stopOver = pq.poll(); // ์ฐ์ ์์ ํ ๋๋ถ์ ์๋์ ์ผ๋ก ์ต๋จ ๊ฑฐ๋ฆฌ ์ ์ ๊ตฌํจ
if (visited[stopOver.no]) continue; // ๋จ, ๋ฐฉ๋ฌธํ์ผ๋ฉด pass
visited[stopOver.no] = true;
if (stopOver.no == end) break; // ๋์ฐฉ์ง์ ๋์ฐฉํ๋ฉด ํ์ถ
// 2) ์์์ ์ ํ๋ ๊ฒฝ์ ์ง์ ์ธ์ ํ ์ ์ ์ค, ํด๋น ๊ฒฝ์ ์ง๋ฅผ ๊ฑฐ์ณ์ ๊ฐ๋ฉด ๋ ์ต๋จ์ผ๋ก ๊ฐ ์ ์๋ ๊ฒฝ๋ก์ ๊ฑฐ๋ฆฌ๋ฅผ ์
๋ฐ์ดํธ
for (int j=0; j<V; k++) {
if (!visited[j] && adjMatrix[stopOver.no][j] && stopOver.distance+adjMatrix[stopOver.no][j] < distance[j]) { // ์์ง ๋ฐฉ๋ฌธํ์ง ์๊ณ , ๊ฒฝ์ ์ง์ ์ธ์ ํ๋ฉฐ, ๊ฒฝ์ ์ง๋ฅผ ๊ฑฐ์ณ๊ฐ๋ฉด ๋ ๋นจ๋ฆฌ ๋์ฐฉํ ์ ์์ผ๋ฉด
distance[j] = stopOver.distance + adjMatrix[stopOver.no][j]; // ์ถ๋ฐ์ง์์๋ถํฐ ๊ฒฝ์ ์ง๊น์ง์ ๊ฑฐ๋ฆฌ์ ๊ฒฝ์ ์ง๋ก๋ถํฐ ์ธ์ ํ ์ ์ ๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ํ ๊ฐ(๊ฒฝ์ ๋น์ฉ)์ผ๋ก ์ต๋จ ๊ฑฐ๋ฆฌ ๊ฐฑ์
pq.offer(new Vertex(j, distance[j])); // ์
๋ฐ์ดํธ ๋ ์ต๋จ๊ฑฐ๋ฆฌ๋ ํ์ ์ฝ์
}
}
}
System.out.println(distance[end]); // ์ต์ข
๋์ฐฉ์ง๊น์ง์ ์ต๋จ ๊ฒฝ๋ก ์ถ๋ ฅ
}
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ Vs ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ
-
๋ค์ต์คํธ๋ผ : ํน์ ์์ ์ ์ ์์ ํน์ ๋์ฐฉ ์ ์ ๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ๊ฒ
- ์์ ์ ์ ์์ ๊ฒฝ์ ์ง๋ฅผ ๊ฑฐ์ณ(ํน์ ๊ฑฐ์น์ง ์๋๋ผ๋) ๋์ฐฉ ์ ์ ๊น์ง ๋๋ฌํ๊ธฐ๊น์ง ๊ฑฐ์ณ์จ ๊ฒฝ๋ก ๋น์ฉ์ ๋ชจ๋ ๋ํ ๊ฒ์ด ์ต์์ธ ๊ฒฝ์ฐ๊ฐ ๋์ฐฉ์ง๊น์ง์ ์ต๋จ๊ฒฝ๋ก
-
ํ๋ฆผ : ์์์ ์์ ์ ์ ์์ ๋ชจ๋ ์ ์ ์ ์ฐ๊ฒฐํ๋ ๊ฐ์ ์ ์ต์ ๋น์ฉ์ ๊ตฌํ๋ ๊ฒ
- ๋ชจ๋ ์ ์ ์ด ํ๋๋ก ์ฐ๊ฒฐ๋์ด์ผ ํจ
- ๊ฐ ๋จ๊ณ ๋ณ ๋์ฐฉ ์ ์ ๊น์ง์ ์ต๋จ ๋น์ฉ์ ๋์ ํฉํ์ง ์๊ณ ๊ทธ๋ฅ ํ์ฌ ๊ฐ์ ๋น์ฉ๋ง์ ๋น์ฉ์ผ๋ก ๊ณ์ฐ