โถ ์ ํ
- ํ ์ ์ ์ ๊ธฐ์ค์ผ๋ก ๋์ฐฉ ์ ์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก ํธ๋ฆฌ๋ฅผ ๋ง๋๋ ๊ฒ
- ๊ฐ์ค์น๊ฐ ์๋ ๋ค์ต์คํธ๋ผ๋ BFS
- ์ฐ์ ์์ ํ๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด O(V^2), ์ฌ์ฉํ๋ฉด O(E+VlogV)๊ฐ ๋๋ค(V๋ ์ ์ ๊ฐ์, E๋ ๊ฐ์ ๊ฐ์)
์ ์ ์ ์ ๋ฐฉ๋ฌธํ ๋, ๊ทธ ์ ์ ์ ์ธ์ ํด์๋ ์ ์ ์ด ์ด๋ฏธ ๋ฐฉ๋ฌธํ ์ ์ ์ด๋ผ๋ฉด ์ ์ฅ๋ผ์๋ ๊ฒฝ๋ก ๊ฐ์ค์น์ ์ ์ ์ ์ ๊ฒฝ์ ํด์ ๋ฐฉ๋ฌธํ๋ ๊ฐ์ค์น๋ฅผ ๋น๊ตํด ๋ ๊ฐ๊น์ด ๊ฒฝ๋ก๋ก ๊ฐฑ์ ํ๋ค. ๊ฒฝ์ ํ๋ค๋ ๊ฐ๋ ์ด ํ์ํ๋ฐ, ์ถ๋ฐ ์ ์ ๋ ์๊ธฐ ์์ ์ ๊ฒฝ์ ํด์ ์ต์ ๊ฐ์ ๋ด๋๋ค๋ ๊ฐ๋ ์ผ๋ก ์ ๊ทผํ๋ฉด ๋๋ค.
์ฐ์ ์์ ํ๋ฅผ ์ฌ์ฉํด์ ๋ค์ต์คํธ๋ผ๋ฅผ ๊ตฌํํ ์์ฌ์ฝ๋๋ฅผ ๋จผ์ ๋ณด์
์ด๋ source๋ ์ถ๋ฐ์ ์ ์ด๋ค. while ๋ถ๋ถ์ด ๊ตฌํ์ธ๋ฐ, ์ต์ ํ์ผ๋ก ๋ ์ฐ์ ์์ ํ์์ ํ๋ ๋ฝ๊ณ , ๊ทธ ์ ์ ์ ์ธ์ ์ ์ ๋ค์ ๋๋ฉด์ ํ์ฌ ์ ์ ์ ๊ฒฝ์ ํด์ ๊ฐ๋๊ฒ ๋น ๋ฅธ์ง(๊ฐ์ค์น ํฉ์ด ์ ์์ง) ๊ฒฝ์ ์ํ๋๊ฒ ๋น ๋ฅธ์ง ๋น๊ตํด์ ์ถ๋ฐ ์ ์ ์์ ๋์ฐฉ ์ ์ ๊น์ง์ ๊ฐ ์ ์ ์ฌ์ด ์ต๋จ๊ฑฐ๋ฆฌ ํฉ์ด ๋ค์ด์๋ dist๋ฐฐ์ด์ ๊ธฐ๋กํ๋ค.
โถ ์ ๋ต
ํ์ ์ธ์ฐ๋ ๊ฒ ๋์ ๊ฒ ๊ฐ๋ค.
์ถ๋ฐ ์ ์ - ๋์ฐฉ ์ ์ ๋๊ฐ๋ง ์๊ฐํ๊ธฐ ๋ณด๋ค ๋ฌด์กฐ๊ฑด ๋์ฐฉ ์ ์ ๋ง ๋ณด๊ณ ๋๋ ค์ผ ๋ ํท๊ฐ๋ฆฐ๋ค.
static class Node {
int end, w;
Node(int to, int w) {
this.end = to;
this.w = w;
}
}
static PriorityQueue<Node> pq;
static List<Node>[] list;
static int[] dist;
static int v;
static int e;
๋์ฐฉ ์ ์ ๊ณผ ๊ฑฐ๊ธฐ๊น์ง์ ๊ฐ์ค์น๋ฅผ ๋ค๊ณ ๋ค๋ Node ํด๋์ค๋ฅผ ํ๋ ๋ง๋ ๋ค.
PriorityQueue๋ฅผ Min-Heap์ผ๋ก(์ค๋ฆ์ฐจ์)๋ก ๋ง๋ค์ด ์ฃผ๊ณ , ๊ฐ ์ ์ ์ ์ธ์ ํ ์ ์ ๋ค์ ๋ฆฌ์คํธ์ ๋ด์ ๋ฐฐ์ด์ ์ ์ธํด์, ์ธ์ ๋ฆฌ์คํธ๋ฅผ ์์ฑํ๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ ์ ์ ์ ๋ฐฉ๋ฌธํ์ ๋์ ์ต์ ๊ฐ์ ๋ด์ dist๋ฐฐ์ด๋ ์ ์ธํ๋ค.
์์ฌ์ฝ๋์ ์ ํ์๋ ์ด๊ธฐํ ๊ณผ์ ์ฒ๋ผ ์งํํ๋ ค๋ฉด
int INF = 100000000;
list = new ArrayList[v + 1];
dist = new int[v + 1];
Arrays.fill(dist, INF);
for (int i = 1; i <= v; i++) {
list[i] = new ArrayList<>(); // ๊ฐ ๋
ธ๋(์ ์ )์ ์ฐ๊ฒฐ๋ ๋ฆฌ์คํธ ์์ฑ
}
pq = new PriorityQueue<Node>((o1, o2) -> {
return o1.w - o2.w;
});
dist๋ฐฐ์ด์ ๋๋ฌํ ์ ์๋ ๊ฐ์ผ๋ก ๋จผ์ ์ด๊ธฐํ ํด๋๊ณ , pq๋ฅผ min-heap์ผ๋ก ๋ง๋ค์ด์ค๋ค.
์ด์ ๋ค์ต์คํธ๋ผ๋ฅผ ๋ณด์.
static void dijkstra(int start) { // ์์ ์ ์ end๊ฐ 0์ด๋ค.
boolean[] vis = new boolean[v + 1];
pq.add(new Node(start, 0));
dist[start] = 0;
while (!pq.isEmpty()) {
Node curNode = pq.poll();
int cur = curNode.end; // ํ์ฌ ๋
ธ๋์์ ์ด๋๋ก ๊ฐ์ง๋ฅผ ๋ณด๋ ๊ฒ ์ค์ํจ
if (vis[cur] == true)
continue;
vis[cur] = true;
for (Node node : list[cur]) {
int tmpW = dist[cur] + node.w;
if (dist[node.end] > tmpW) {
dist[node.end] = tmpW;
pq.add(new Node(node.end, dist[node.end]));
}
}
}
}
์์ ์ ์ ์ ๋ฃ์ ๋, ์ด๋์ ๊ฑฐ๋ฆฌ ๊ฐ์ ๋น์ฐํ 0์ด๊ณ ์ด๋ ์ด๋ํ๋ ๊ฒ๋ ์๋๋๊น dist[start]์๋ 0์ด ๋ค์ด๊ฐ๋ค.
์ด ๊ณผ์ ์์ vis ๋ฐฐ์ด์ด ํ๋ ๋ ํ์ํ๋ค. ์ด๋ฏธ ๋ฐฉ๋ฌธํ ์ ์ ์ ๋์ฐฉํด์ ์ธ์ ๋ฆฌ์คํธ๋ฅผ ๋์ง์๋๋ก ํ๋ ๊ณผ์ ์ธ๋ฐ, ๋ค์ต์คํธ๋ผ๋ ์ด๋ฏธ ๋์ฐฉํ ์ง์ ์์์ ์ต๋จ๊ฒฝ๋ก๋ฅผ ๋ณด์ฅํ๊ธฐ ๋๋ฌธ์ ๋ถํ์ํ ํ์์ ๋ง๊ธฐ์ํด ์ค์ ํ๋ ์ฅ์น๋ผ๊ณ ๋ณผ ์ ์๋ค.
์ด์ ๋์ฐฉํ ์ ์ ์ ์ธ์ ๋ฆฌ์คํธ(๊ทธ ์ ์ ๊ณผ ์ธ์ ํ ๋ชจ๋ ์ ์ ๋ค)์ ์ํํ๋ค.
๊ทธ ์ ์ ์ผ๋ก ๋ฐ๋ก ๊ฐ๋ ๊ฐ๊ณผ, ํ์ฌ ์ ์ ์ ๊ฒฝ์ ํด์ ๊ทธ ์ ์ ์ผ๋ก ๊ฐ๋ ๊ฐ์ ๋น๊ตํ๋ ค๊ณ tmpW์ ๊ฐ์ ๋ด๋๋ค. node.w๋ ๋์ฐฉํ ์ ์ ์ ์ธ์ ํ ์ ์ ์ ๊ฐ์ค์น์ด๊ณ , ๋์ฐฉํ ์ ์ ๊น์ง์ ๊ฐ์ค์น๋ฅผ ๋ํด์ ๊ฒฝ์ ํ ๊ฐ์ ๋ฏธ๋ฆฌ ์ ์ฅํ ๊ฒ tmpW๋ค.
์ด๊ฑธ dist[node.end]์ ๋น๊ตํ๋ค. dist[node.end]๋ ๋์ฐฉํ ์ ์ ๊ณผ ์ธ์ ํ ์ ์ ๊น์ง์ ํ์ฌ ์ต๋จ ๊ฒฝ๋ก๊ฐ ๋ด๊ฒจ์๋๋ฐ, ์ด๊ฑธ ๊ฐฑ์ ํ๊ฒ ๋๋ฉด ๊ฐฑ์ ํด์ pq์ ๋ค์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
๋ด๊ฐ ๊ฐ์ธ์ ์ผ๋ก ๋ค์ต์คํธ๋ผ์์ ์ด๋ ค์ํ๋ ๊ฑด, ์ ๋ ฅ์ด ์ ์ - ์ ์ - ๊ฐ์ค์น ํํ๊ฐ ์๋๋ผ, map์ผ๋ก ์ค ๋๋ค. ๊ฐ์ ํํ๋ฅผ ๋ค ๋ง๋ค์ด์ผํ๋? ํ๋ ๊ณ ๋ฏผ์์ ๋ถํฐ ์๊ฐ์ด ๊ผฌ์ด๊ธฐ ์์ํ๋ ๋ฐ, ์๋์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ์.
Node์ ํํ๋ถํฐ ๋ฐ๊ฟ์ผํ๋ค. ์ถ๋ฐ ์ ์ , ๋์ฐฉ ์ ์ ์ ๊ธฐ๋กํ๋ค.
dist๋ 2์ฐจ์ ๋ฐฐ์ด๋ก ์ ์ธํ๊ณ , ๋ชจ๋ dist ์์์ INF๋ฅผ ๋ฃ์ด์ค๋ค. ์ด ์ ์ ๊ฐ์, ๊ฐ์ ๊ฐ์๋ map์ ๋ฐ๋ผ ๋ฌ๋ผ์ง์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก nxn์ผ ๋ ์๋ ์ ์ธํ ๊ฒ๊ณผ ๊ฐ๋ค.
static class Node{
int s;
int e;
int d;
Node (int s, int e, int d) {
this.s = s;
this.e = e;
this.d = d;
}
}
static int dist[][];
v = n * n;// ์ ์ ๊ฐ์๋ map ์นธ ๊ฐ์
e = n * (n - 1) / 2; // ์ด ๊ฐ์ ๊ฐ์
// main์์
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
dist[i][j] = INF;
}
}
์ด์ ์ค์ํ ๋ถ๋ถ์ด๋ค.
๊ฐ์ค์น๊ฐ ์๋ ๋ค์ต์คํธ๋ผ๋ BFS๋ผ๊ณ ์์์ ์ ์ด๋จ๋ค. map์ ์ฃผ๊ณ ์ต๋จ๊ฒฝ๋ก๋ฅผ ์ฐพ์ผ๋ผ๋ ๋ฌธ์ ๋ BFS์ฒ๋ผ ์๋ํด์ผ ๋๊ธฐ๋๋ฌธ์ ๋ฐฉํฅ๋ฐฐ์ด์ ๋ง๋ค๊ณ , ์ ํจ๋ฒ์ ์์์ ๋ฐฉํฅ์ ๋๋ฉฐ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ์์ผํ๋ค.
static int[] di = { -1, 0, 1, 0 };
static int[] dj = { 0, 1, 0, -1 };
public static void dijkstra() {
pq.add(new Node(0, 0, dist[0][0]));
while(!pq.isEmpty()) {
Node now = pq.poll();
int ci = now.s;
int cj = now.e;
int d = now.d;
if(d > dist[ci][cj])continue;
for(int i=0;i<4;i++) {
int ni = di[i] + ci;
int nj = dj[i] + cj;
if(ni>=0 && ni<n && nj>=0 && nj<n) {
if(dist[ni][nj] > dist[ci][cj] + map[ni][nj]) {
dist[ni][nj] = dist[ci][cj] + map[ni][nj];
pq.add(new Node(ni,nj,dist[ni][nj]));
}
}
}
}
}
(0,0) -> (n-1.n-1) ๋ก ๊ฐ ๋์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ๋ค์ต์คํธ๋ผ๋ค.
ํ์ ๊ฐ์ง๋ง, ์ธ์ ๋ฆฌ์คํธ๋ฅผ ํตํด ๋น๊ตํ๋๊ฒ์ด ๋ฐฉํฅ๋ฐฐ์ด์ ๋๋ฉด์ ๋น๊ตํ๋ ๊ฒ์ผ๋ก ๋ฐ๋์๋ค. ์ต๋จ๊ฑฐ๋ฆฌ ๊ฐ ๊ฐฑ์ ํ๋ ๋ถ๋ถ์ ์ด ์ฝ๋๊ฐ ๋ ๋์ ์๋ค์ด์ค๋ ๊ฒ ๊ฐ๊ธฐ๋ ํ๋ค.
์ธ์ ๋ฆฌ์คํธ, ์ธ์ ํ๋ ฌ ๋ชจ๋ ์ค์ํ ๊ฑด ๊ฐฑ์ ํ๋ ๋ถ๋ถ์ด๋ค.
๋จผ์ ์ธ์ ํ๋ ฌ
if(d > dist[ci][cj])continue;
for(int i=0;i<4;i++) {
int ni = di[i] + ci;
int nj = dj[i] + cj;
if(ni>=0 && ni<n && nj>=0 && nj<n) {
if(dist[ni][nj] > dist[ci][cj] + map[ni][nj]) {
dist[ni][nj] = dist[ci][cj] + map[ni][nj];
pq.add(new Node(ni,nj,dist[ni][nj]));
}
}
}
๊ทธ๋ค์ ์ธ์ ๋ฆฌ์คํธ๋ค.
boolean[] vis = new boolean[v + 1]; // ๋ฐฉ๋ฌธ์ฒดํฌํ ๋ฐฐ์ด ํจ์ ์ค์ฝํ ๋ด์์ ์ ์ธ
if (vis[cur] == true)
continue;
vis[cur] = true;
for (Node node : list[cur]) {
int tmpW = dist[cur] + node.w; // dpํธ๋ ๊ฒ ์ฒ๋ผ dist๊ฐ๊ณผ ๋น๊ตํด์ผ๋๋ค.
if (dist[node.end] > tmpW) {
dist[node.end] = tmpW;
pq.add(new Node(node.end, dist[node.end]));
}
}
ํ์ ์ ์ธ์์ ํ์.
๋์์ด ๋๋ค๋ฉด ๋๊ธ์ด๋ ๊ณต๊ฐ ๋ฒํผ ํ ๋ฒ์ฉ ๋๋ฅด๊ณ ๊ฐ์ฃผ์ธ์! ๋ก๊ทธ์ธ ์ํด๋ ๋ฉ๋๋ค ^_^
'OJ๐ผ > ์๊ณ ๋ฆฌ์ฆ ์ ํ ์ ๋ฆฌ๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ ๋ ฌ - Comparable<T> ~ compareTo(T o1) (0) | 2024.05.29 |
---|---|
Dynamic Programming์ด ์์ธ DFSโ๏ธ - ๋ด๋ฆฌ๋ง๊ธธ, ์์ฌ์์ด ํ๋ค๐ผ (0) | 2024.04.07 |
์ ๋ ฌโ๏ธ- ์์์ ๋ ฌ (0) | 2024.04.04 |
Bruteforce๐คฎ - ์์ด, ์กฐํฉ, ๋ถ๋ถ์งํฉ (0) | 2024.03.31 |
๋ฐฐ๋ญ ๋ฌธ์ Knapsack๐ - 12865๋ฒ: ํ๋ฒํ ๋ฐฐ๋ญ (2) | 2024.03.25 |