์ค๋์ ๊ทธ๋ํ, ๊ทธ๋ฆฌ๋๋ฅผ ํ์ฉํ๋ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ๋ํด ์ ๋ฆฌํด๋ณด๋ ค๊ตฌ ํ๋ค.
์ด๋ฆ์ ๋๋ฌด๋๋ฌด ๋ง์ด ๋ค์ด๋ดค์ง๋ง, ํ๋ฒ๋ ์ ๋๋ก ๊ณต๋ถํด๋ณธ์ ์ ์๋,,!!
๐ ๋ค์ต์คํธ๋ผ(Dijkstra) ์๊ณ ๋ฆฌ์ฆ
๋ค์ต์คํธ๋ผ๋ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ์ ์ ์๋ ์๊ณ ๋ฆฌ์ฆ ์ค ํ๋์ด๋ค.
์ต๋จ ๊ฒฝ๋ก
๊ฐ์ ์ ๊ฐ์ค์น๊ฐ ์๋ ๊ทธ๋ํ์์, ๋ ์ ์ ์ฌ์ด์ ๊ฒฝ๋ก๋ค ์ค ๊ฐ์ ์ ๊ฐ์ค์น ํฉ์ด ์ต์์ธ ๊ฒฝ๋ก
๐ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค๋ ๊ฒ์,
ํ๋์ ์์ ์ ์ ์์ ๋ ์ ์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ค๋ ๊ฒ์ ์๊ธฐํ๋ค.
์๋ ๊ทธ๋ฆผ์ ์๋ก ๋ณด์.
A๊ฐ ์์์ ์ด๊ณ C๊ฐ ๋ชฉ์ ์ง๋ผ๊ณ ํ ๋, ๊ฐ์ฅ ๋จผ์ A์ ์ธ์ ํด์๋ ์ ์ ์ B์ C์ด๋ค.
์ด ๋ A๊ฐ C๋ก ๊ฐ๊ธฐ ์ํด์๋ ๋ ๊ฐ์ง ์ ํ์ง๊ฐ ์๊ธด๋ค.
- ๋ฐ๋ก C๋ก ๊ฐ์!
- B๋ฅผ ๊ฑฐ์ณ์ C๋ก ๊ฐ์!
์์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด C๊ฐ ๋ฐ๋ก ์ธ์ ํด์์์๋ ๋ถ๊ตฌํ๊ณ ,
๊ฐ์ ์ ๊ฐ์ค์น๋ก ์ธํด B๋ฅผ ๊ฑฐ์ณ C๋ก ํฅํ๋ ๊ฒ์ด ๋ ์ต๋จ ๊ฒฝ๋ก์์ ์ ์ ์๋ค.
์ ์์์ ๊ฒฝ์ฐ ๋จ์ํ B์ ์ ํ๋๋ง์ ๊ฑฐ์น๋ฉด ๋๋ฏ๋ก ๊ฐ๋จํด๋ณด์ด์ง๋ง,
๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋งค์ฐ ๋ง์ ์ซ์์ ์ ์ ์ ์ง๋๋ ๊ฒ์ด ๋ ์ต๋จ ๊ฒฝ๋ก๊ฐ ๋ ์ ์๋ค.
๊ทธ๋ด ๋์๋ ํ๋ ํ๋ ๊ฒฝ๋ก๋ฅผ ๋ฐ์ ธ๋ณด๋ ๊ฒ์ด ์ด๋ ค์์ง ์ ์๋๋ฐ,
์ด ๋ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์๋ ์๊ณ ๋ฆฌ์ฆ์ด ๋ฐ๋ก ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ! ๐
๐ฅ ์ฃผ์ ์ฌํญ
๊ทธ๋ฐ๋ฐ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์ฒดํฌํด์ผ ํ ์ ์ด ์๋ค.
๋ค์ต์คํธ๋ผ๋ '์'์ ๊ฐ์ค์น๋ฅผ ํ์ฉํ์ง ์๋๋ค.
๋ฐ๋ผ์ ์์ ๊ฐ์ค์น๋ฅผ ํฌํจํ๋ ๋ฌธ์ ์ ๊ฒฝ์ฐ ๋ฒจ๋ง-ํฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด์ผ ํ๋ค.
์ด ์ธ์๋ ํ๋ก์ด๋-์์ฌ ๊ฐ์ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ๋ฉด
์ข ๋ ํจ์จ์ ์ผ๋ก ๋ชจ๋ ์ ์ ๋ค์ ๋ํ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ํ์ํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ฐ,
๋ฒจ๋ง ํฌ๋์ ํ๋ก์ด๋ ์์ฌ์ ๋ค์์!! ๋ค๋ค๋ณด๋๋ก ํ๊ฒ ๋ค.
๐ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ
๋๋ ๋ฐฑ์ค ์ฌ์ดํธ์ #1753 ์ต๋จ ๊ฒฝ๋ก ๋ฌธ์ ๋ฅผ ๊ตฌํํ๋ ์ฝ๋๋ก ์์ฑํ๋ค.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class BOJ_1753 {
static class Node {
int to, weight;
public Node(int to, int weight) {
this.to = to;
this.weight = weight;
}
}
static int V, E, S;
static List<Node>[] list;
static int[] dis;
static boolean[] visited;
public static void main(String[] args) throws Exception{
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(in.readLine());
StringBuilder out = new StringBuilder();
V = Integer.parseInt(st.nextToken()); // ์ ์ ๊ฐ์
E = Integer.parseInt(st.nextToken()); // ๊ฐ์ ๊ฐ์
S = Integer.parseInt(in.readLine()) - 1; // ์์ ์ ์
dis = new int[V];
visited = new boolean[V];
list = new ArrayList[V];
for(int i = 0 ; i < V ; i++) {
list[i] = new ArrayList<>();
}
for(int i = 0 ; i < E ; i++) {
st = new StringTokenizer(in.readLine());
int from = Integer.parseInt(st.nextToken()) - 1; // u
int to = Integer.parseInt(st.nextToken()) - 1; // v
int weight = Integer.parseInt(st.nextToken()); // ๊ฐ์ค์น
list[from].add(new Node(to, weight)); // ์ ํฅ ์ฒ๋ฆฌ
}
Arrays.fill(dis, Integer.MAX_VALUE);
dis[S] = 0; // ์์์ ๋ง 0์ผ๋ก ๋ง๋ค๊ธฐ
Dijk();
for(int i = 0; i < V ; i++) {
if(dis[i] == Integer.MAX_VALUE) out.append("INF" + "\n");
else out.append(dis[i] + "\n");
}
System.out.print(out);
}
public static void Dijk() { // ๋ค์ต์คํธ๋ผ
PriorityQueue<Node> pq = new PriorityQueue<>((o1, o2) -> Integer.compare(o1.weight, o2.weight)); // ๊ฐ์ค์น ๊ธฐ์ค ์ ๋ ฌ
pq.offer(new Node(S, 0));
while(!pq.isEmpty()) {
Node now = pq.poll();
if(dis[now.to] < now.weight) continue;
for(int i = 0; i < list[now.to].size(); i++) {
Node next = list[now.to].get(i);
if(dis[next.to] > now.weight + next.weight) {
dis[next.to] = now.weight + next.weight;
pq.offer(new Node(next.to, dis[next.to]));
}
}
}
}
}
/*
[test case]
5 6
1
5 1 1
1 2 2
1 3 3
2 3 4
2 4 5
3 4 6
*/
์ฝ๋ ์๋จ์์๋ถํฐ ์ฐจ๋ก๋๋ก ์ค๋ช ํด๋ณด๊ฒ ๋ค.
โ๏ธ Node ํด๋์ค
ํ๋์ ์ ์ ์ ํํํ๋ ํด๋์ค๋ฅผ ๋ง๋ค์ด์ฃผ์๋ค.
to(๊ฐ๋ฆฌํค๋ ์ ์ )์ weight(๊ฐ๋ฆฌํค๋ ์ ์ ๊น์ง์ ๊ฐ์ค์น)์ด๋ผ๋ ์ ๋ณด๋ฅผ ๊ฐ์ง๋ค.
โ๏ธ ๋ค์ต์คํธ๋ผ๋ฅผ ์ํ ์ค๋น๋ฌผ list, dis, visited
list๋ ๊ฐ ์ ์ ๋ง๋ค, ๊ฐ๋ฆฌํค๋ ์ ์ ๋ค์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ง ์ ์๋๋ก ํ๋ ์ญํ ์ ํ๋ค.
dis๋ ๊ฐ ์ ์ ๋ง๋ค ์์์ ์์๋ถํฐ ์ค๋๋ฐ ๊ฑธ๋ฆฐ ์ต๋จ ๊ฐ์ค์น๋ฅผ ์ ์ฅํ๋ค.
visited๋ ๊ฐ ์ ์ ๋ง๋ค ๋ฐฉ๋ฌธํ์ ์๋์ง ์ฌ๋ถ๋ฅผ ์ ์ฅํ๋ค.
โ๏ธ list ์ด๊ธฐํ
์๋์ list ์ด๊ธฐํ๊ฐ ์๋ฃ๋ ๋ชจ์ต์ ๊ทธ๋ฆผ์ผ๋ก ํํํ๋ค.
list์ '์ธ๋ฑ์ค == ์ ์ ๋ฒํธ'๋ผ๊ณ ๊ฐ์ , ๊ฐ ์ ์ ๋ง๋ค ๊ฐ๋ฆฌํค๋ ์ ์ ์ ์ ๋ณด๋ค์ ์ ์ฅํด์ฃผ์๋ค.
์ด ๋ฌธ์ ์ ๊ฒฝ์ฐ ์ ํฅ ๊ทธ๋ํ์ด๋ฏ๋ก, ์ถ๋ฐํ๋ ์ ์ ์ ๋์ฐฉํ๋ ์ ์ ์ ์ ๋ณด๋ง ์ ์ฅํด์ฃผ๋ฉด ๋๋ค.
โ๏ธ ์ต๋จ ๊ฒฝ๋ก ํ์ ์ , ์ค๋น
dis ๋ฐฐ์ด์ ๊ณ์ํด์ ์ต์๊ฐ์ ์ ๋ฐ์ดํธํด์ฃผ์ด์ผ ํ๋ฏ๋ก Intger.MAX_VALUE๋ก ๋ชจ๋ ์ฑ์์ฃผ์๋ค.
์์์ ์ ํด๋นํ๋ ์ธ๋ฑ์ค์๋ 0์ ์ ์ฅํด์ฃผ์๋ค. (์๊ธฐ ์์ ์๊ฒ ๊ฐ๋ ๊ฑฐ๋ฆฌ๋ ๋น์ฐํ 0์ด ์ต์๋๊น!)
โ๏ธ ์ต๋จ ๊ฒฝ๋ก ํ์ Dijk() ๋ฉ์๋
[1] PriorityQueue๋ฅผ ์ด์ฉํ ์ ์ ๋ง๋ค์ ์ต์ ๊ฒฝ๋ก ํ์
Node ํ์ ์ผ๋ก PriorityQueue๋ฅผ ๋ง๋ค๊ณ , weight(๊ฐ์ค์น)๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋๋ก ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์์์ ์ ๋ํ ์ ๋ณด๋ ๋ณธ๊ฒฉ์ ์ธ ํ์ ์์ ์ ์ถ๊ฐํ๋ค.
(*๊ผญ ์ฐ์ ์์ ํ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ๊ฒ์ ์๋์ง๋ง, ๋งค ๋ฒ ์ต์๊ฐ ๋๋ ๊ฒ๋ง ํ์ํ ๊ฒฝ์ฐ
์ฐ์ ์์ ํ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋๋ถ๋ถ ๊ฐ์ฅ ํจ์จ์ ์ด๋ฏ๋ก!! ์ด๋ ๊ฒ ํด์ฃผ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์์ฉ)
[2] pq๊ฐ ๋น ๋๊น์ง ํ์
- pq์ ์ฒซ ๋ฒ์งธ ์์(pq์ ์ ์ฅ๋ ์ ์ ์ค ๊ฐ์ฅ ์์ ๊ฐ์ค์น๋ฅผ ๊ฐ์ง๋ ์ ์ )๋ถํฐ ๊บผ๋ด์ด now์ ๋ด์๋ค.
- now๊ฐ ๊ฐ๋ฆฌํค๋ ์ ์ ์ ์ต๋จ ๊ฒฝ๋ก(dis[now.to])๊ฐ now์ ๊ฐ์ค์น๋ณด๋ค ์๋ค๋ฉด continue ํ๋ค.
(=> ์ด์ฐจํผ ์ด ๊ฒฝ๋ก๋ ์ต๋จ์ด ๋ ์ ์๋ ๊ฒ์ด๋ฏ๋ก!) - ๊ทธ ์ธ์ ๊ฒฝ์ฐ์๋ now๊ฐ ๊ฐ๋ฆฌํค๋ ์ ์ ์ list๋ฅผ ๋๋ฉด์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ํ์ํ๋ค.
๊ฐ์ฅ ๋จผ์ now๊ฐ ๊ฐ๋ฆฌํค๋ ์ ์ ์ธ now.to๊ฐ ๊ฐ๋ฆฌํค๋ ์ ์ ์ธ list[now.to].get(i)์ ๋ํ ์ ๋ณด๋ฅผ next์ ๋ด์๋ค.
๋ง์ฝ dis[next]๊ฐ now์ ๊ฐ์ค์น๊ณผ next์ ๊ฐ์ค์น๋ฅผ ํฉํ ๊ฒ๋ณด๋ค ํฌ๋ค๋ฉด dis[next]๋ฅผ ์ ๋ฐ์ดํธ ํด์ฃผ์๊ณ ,
๊ทธ ๋ค์์ ๊ฒฝ๋ก ๋ํ ํ์ํด๋ณผ ๊ฐ์น๊ฐ ์๋ ๊ฒ์ผ๋ก ํ๋จํ์ฌ ๋ค์ ํ์์ ์ํ ์ ๋ณด๋ฅผ pq์ ์ถ๊ฐํ๋ค.
๐ ์ ๋ฆฌ
๋ค์ต์คํธ๋ผ๋ ์์ ๊ฐ์ค์น๋ง์ ๊ฐ์ง๋ ์ต๋จ ๊ฒฝ๋ก ํ์์ ์ ์ฉํ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
๋งค ํ์๋ง๋ค ๋ ์ ํฉํ ๊ฒฝ๋ก๋ฅผ ์ฐพ์๋๊ฐ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ ์ ์์ผ๋ฉฐ,
์ฐ์ ์์ ํ๋ฅผ ์ด์ฉํ๋ฉด ๋ ํจ์จ์ ์ผ ์ ์๋ค.
โ ์ถ๊ฐ
๋ฌธ์ ๋ฅผ ๋ ํ์ด๋ณด๋ค๋ณด๋,, ๊ทธ๋ฅ BFS๋ก ํธ๋๋ฐ,
Queue ๋์ PriorityQueue๋ก ์ฌ์ฉํ๋ค๊ณ ์๊ฐํ๋๊น ํจ์ฌ ์ดํด๊ฐ ์ฌ์ ๋ค !!
'5๏ธโฃ CS > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java Algorithm Note] ๋ถ๋ถ์งํฉ (feat. ์ฌ๊ท) (0) | 2022.08.16 |
---|---|
[Java Algorithm Note] ์กฐํฉ (feat. ์ฌ๊ท) (0) | 2022.08.15 |
[Java Algorithm Note] ์์ด (feat. ์ฌ๊ท) (0) | 2022.08.15 |
[Swift Algorithm Note] ์ต์ฅ ์ฆ๊ฐ ๋ถ๋ถ ์์ด 2 (feat. BS) (0) | 2021.08.29 |
[Swift Algorithm Note] ์ต์ฅ ์ฆ๊ฐ ๋ถ๋ถ ์์ด (feat. DP) (0) | 2021.08.28 |
๋๊ธ