๊ฐ์ค์น๊ฐ ์๋ ๊ทธ๋ํ์ ์ต๋จ๊ฑฐ๋ฆฌ ๋ฌธ์ ๋ ๋๋ถ๋ถ BFS๋ก ํด๊ฒฐํ ์ ์์ต๋๋ค. ํ์ง๋ง, ๊ฐ์ ์ ๊ฐ์ค์น๊ฐ ์กด์ฌํ๋ค๋ฉด BFS๊ฐ ์๋ ์ต๋จ๊ฑฐ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ์ ํตํด ์ ๊ทผํด์ผ ํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ค์น ๊ทธ๋ํ์ ์ต๋จ๊ฑฐ๋ฆฌ ๋ฌธ์ ๋ ๋ค์๊ณผ ๊ฐ์ ์ ํ์ด ์กด์ฌํฉ๋๋ค.
- ๋ ์ ์ ๊ฐ์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ๋ฌธ์
- ํ๋์ ์ ์ ์์ ๋ค๋ฅธ ๋ชจ๋ ์ ์ ๊ณผ์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ๋ฌธ์
- ํ๋์ ์ ์ ์ผ๋ก ๊ฐ๋ ๋ชจ๋ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ๋ฌธ์
- ์ ์ ๊ฐ์ ๋ชจ๋ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ๋ฌธ์ - ํ๋ก์ด๋-์์ฌ
์ ๋ฒ ๊ธ์์๋ 4๋ฒ ์ ํ์ ํด๊ฒฐํ๊ธฐ ์ํ ํ๋ก์ด๋-์์ฌ ์๊ณ ๋ฆฌ์ฆ์ ๋ํด ์์๋ณด์์ต๋๋ค. ์ด๋ฒ ๊ธ์์๋ 2๋ฒ ์ ํ์ ํด๊ฒฐํ ์ ์๋ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ๋ํด์ ์์๋ณด๊ฒ ์ต๋๋ค.
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ๋จํ๊ฒ ์ค๋ช ํ๋ฉด ์์ ์ ์ ์์ ๊ฑฐ๋ฆฌ๊ฐ ์ต์์ธ ์ ์ ์ ์ ํํด ๋๊ฐ๋ฉฐ ์ต๋จ๊ฑฐ๋ฆฌ๋ ๊ตฌํ๋ ๋ฐฉ์์ ๋๋ค. ํด๋น ๊ณผ์ ์ ๊ฐ๋จํ ์๋์ฝ๋๋ก ๋ํ๋ด๋ฉด ๊ฐ์ต๋๋ค.
V -> ์ ์ ์ ๊ฐ์
Start -> ์์ ์ ์
Adjacency -> ์ธ์ ํ๋ ฌ or ์ธ์ ๋ฆฌ์คํธ
Distance -> ์์ ์ ์ ๋ถํฐ ๊ฐ ์ ์ ๊ฐ์ ์ต๋จ๊ฑฐ๋ฆฌ
Visited -> ์ต๋จ๊ฑฐ๋ฆฌ๊ฐ ๊ฐฑ์ ๋์๋์ง ์ฒดํฌ
for i in (1 to V) :
Distance[i] = Adjacency[Start][i]
for ๋ชจ๋ ์ ์ ์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐฑ์ ํ์ ๊ฒฝ์ฐ :
update_vertex = Distance ์ค ์ต์๊ฐ์ ๊ฐ์ง๋ ์ ์
visited[i] = true;
for adj_vertex in update_vertex์ ์ธ์ ์ ์ :
Distance[adj_vertex] = Min(Distance[adj_vertext],
Distance[update_vertex] + Adjacency[update_vertex][adj_vertex][])
Distance ๋ฐฐ์ด์ ์์ ์ ์ (Start)๋ก๋ถํฐ ๊ฐ ์ ์ ๊น์ง์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ์ ์งํ๋ ๋ฐฐ์ด์ ๋๋ค. ๋จผ์ ์ธ์ ํ๋ ฌ์ ์ ๋ณด๋ฅผ ํตํด ํด๋น ๋ฐฐ์ด์ ์ด๊ธฐํํด์ค๋๋ค. ์ดํ ๋ชจ๋ ์ ์ ์ ๋ํด ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐฑ์ ํ๋ ์์ ์ ์งํํฉ๋๋ค. ์ด ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์น๊ฒ ๋ฉ๋๋ค.
- ํ์ฌ ๋ฐฉ๋ฌธํ ์ ์ ๋ค(visited = true)๊ณผ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ฑฐ๋ฆฌ์ ์๋ ์ ์ ์ ์ ํํฉ๋๋ค. => update_vertex
- ํด๋น ์ ์ ์ ๋ฐฉ๋ฌธ ์ฒดํฌํฉ๋๋ค.
- ํด๋น ์ ์ (update_vertex)์ ์ธ์ ์ ์ (adj_vertex)์ ์ํํ๋ฉด์ update_vertex๋ฅผ ๊ฑฐ์ณ์ adj_vertex๋ก ๊ฐ๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ ๊ฐ๊น๋ค๋ฉด Distance[adj_vertex]๋ฅผ ํด๋น ๊ฐ์ผ๋ก ๊ฐฑ์ ํฉ๋๋ค.
์์ ๊ณผ์ ์ ๋ชจ๋ ์ ์ ์ด ๋ฐฉ๋ฌธ๋ ๋๊น์ง ๋ฐ๋ณตํ๋ฉด ์์ ์ ์ ๋ถํฐ ๋ชจ๋ ์ ์ ๊ณผ์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅํ๊ณ ์๋ Distance ๋ฐฐ์ด์ ๊ตฌํ ์ ์์ต๋๋ค.
๋ฐฑ์ค์์ ๋ค์ต์คํธ๋ผ ๊ธฐ๋ณธ๋ฌธ์ ์ธ 1753. ์ต๋จ๊ฒฝ๋ก ๋ฌธ์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์์ ์๋์ฝ๋๋ฅผ ์ด์ฉํด Java๋ก ๊ตฌํํ ์ ๋ต์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
public class Solution1753 {
static final int INF = 10 * 20001;
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static HashMap<Integer, Integer>[] adj;
static boolean[] visited;
static int[] distance;
static int V, E, start;
public static void main(String[] args) throws IOException {
String[] input = br.readLine().split(" ");
V = Integer.parseInt(input[0]);
E = Integer.parseInt(input[1]);
adj = new HashMap[V + 1];
visited = new boolean[V + 1];
distance = new int[V + 1];
start = Integer.parseInt(br.readLine());
for (int i = 1; i < V + 1; i++) {
adj[i] = new HashMap<>();
}
for (int i = 0; i < E; i++) {
String[] line = br.readLine().split(" ");
int src = Integer.parseInt(line[0]);
int dest = Integer.parseInt(line[1]);
int weight = Integer.parseInt(line[2]);
if (adj[src].containsKey(dest) && adj[src].get(dest) > weight) {
adj[src].put(dest, weight);
} else if (!adj[src].containsKey(dest)) {
adj[src].put(dest, weight);
}
}
// init distance
for (int i = 1; i < V + 1; i++) {
if (start == i) {
distance[i] = 0;
continue;
}
if (!adj[start].containsKey(i))
distance[i] = INF;
else
distance[i] = adj[start].get(i);
}
djkstra();
for (int i = 1; i < V + 1; i++) {
if (distance[i] == INF)
System.out.println("INF");
else
System.out.println(distance[i]);
}
}
private static void djkstra() {
for (int id = 1; id < V + 1; id++) {
int idx = -1;
int minDist = INF;
for (int i = 1; i < V + 1; i++) {
if (visited[i] || minDist < distance[i]) continue;
idx = i;
minDist = distance[i];
}
visited[idx] = true;
if (minDist == INF) continue;
for(Integer dest : adj[idx].keySet()) {
int weight = adj[idx].get(dest);
if (visited[dest] || distance[dest] <= distance[idx] + weight) continue;
distance[dest] = distance[idx] + weight;
}
}
}
}
ํด๋น ๋ฌธ์ ๋ ์ ์ ์ ๊ฐ์๊ฐ 200,000๊ฐ์ด๊ธฐ ๋๋ฌธ์ ์ธ์ ๋ฆฌ์คํธ๋ก ํํํ์์ต๋๋ค. ์ฌ๊ธฐ์ ํ ๊ฐ์ง ๋ฌธ์ ์กด์ฌํ๋๋ฐ ์์ ์ฝ๋๋ O(V^2)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๊ฒ ์ ์ ์ด ๋ง์ ๊ฒฝ์ฐ์๋ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์ ์ต์ ํ ์ํฌ ์ ์๋ ๋ถ๋ถ์ ํ์ฌ ๋ฐฉ๋ฌธํ ์์ญ๊ณผ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ๋ ์ ์ ์ ๊ตฌํ๋ ๋ถ๋ถ์ ๋๋ค. ๋จ์ํ ๋ฐฐ์ด๋ก ์ ์ฅํ๋ ๊ฒ์ด ์๋ ์ฐ์ ์์ ํ๋ฅผ ํตํด ํด๋น ๊ณผ์ ์ ์ํํ๋ค๋ฉด O(N) => O(logN)์ผ๋ก ๋จ์ถํ ์ ์๊ณ ์ต์ข ์ ์ผ๋ก O((|E| + |V|) * logV)์ ์๊ฐ๋ณต์ก๋๋ก ์ต์ ํ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
์ฐ์ ์์ํ๋ฅผ ํตํด ๊ตฌํํ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.PriorityQueue;
public class Solution1753 {
static class Edge implements Comparable<Edge> {
int id;
int weight;
public Edge(int id, int weight) {
this.id = id;
this.weight = weight;
}
@Override
public int compareTo(Edge o) {
return Integer.compare(this.weight, o.weight);
}
}
static final int INF = 10 * 20001;
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static ArrayList<Edge>[] adj;
static boolean[] visited;
static int[] distance;
static int V, E, start;
public static void main(String[] args) throws IOException {
String[] input = br.readLine().split(" ");
V = Integer.parseInt(input[0]);
E = Integer.parseInt(input[1]);
adj = new ArrayList[V + 1];
visited = new boolean[V + 1];
distance = new int[V + 1];
start = Integer.parseInt(br.readLine());
for (int i = 1; i < V + 1; i++) {
adj[i] = new ArrayList<>();
}
for (int i = 0; i < E; i++) {
String[] line = br.readLine().split(" ");
int src = Integer.parseInt(line[0]);
int dest = Integer.parseInt(line[1]);
int weight = Integer.parseInt(line[2]);
adj[src].add(new Edge(dest, weight));
}
// init distance
for (int i = 1; i < V + 1; i++) {
if (start == i) {
distance[i] = 0;
continue;
}
distance[i] = INF;
}
djkstra();
for (int i = 1; i < V + 1; i++) {
if (distance[i] == INF)
System.out.println("INF");
else
System.out.println(distance[i]);
}
}
private static void djkstra() {
PriorityQueue<Edge> pq = new PriorityQueue<>();
pq.add(new Edge(start, 0));
while(!pq.isEmpty()) {
Edge cur = pq.poll();
if (cur.weight > distance[cur.id]) continue;
for (int i = 0; i < adj[cur.id].size(); i++) {
Edge next = adj[cur.id].get(i);
if (distance[next.id] > distance[cur.id] + next.weight) {
distance[next.id] = distance[cur.id] + next.weight;
pq.add(new Edge(next.id, distance[next.id]));
}
}
}
}
}
์ฌ๊ธฐ์ ์ฃผ๋ชฉํ ๋ถ๋ถ์ ๊ธฐ์กด์ visited๋ฅผ ํตํด ๋ฐฉ๋ฌธ์ฒดํฌ๋ฅผ ํด์คฌ๋ ๊ฒ๊ณผ ๋ฌ๋ฆฌ ์ฐ์ ์์ํ๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐฑ์ ํ ํ, ํ์ฌ ๊ฑฐ๋ฆฌ๊ฐ distance์ ๊ฐ๋ณด๋ค ํด ๊ฒฝ์ฐ ๊ฑด๋ ๋์ผ๋ก์จ ๋ฐฉ๋ฌธ ์ฒดํฌ๋ฅผ ํ ์ ์๋ค๋ ์ ์ ๋๋ค.
์ด๋ฒ ๊ธ์์๋ ํ ์ ์ ์์ ๋ค๋ฅธ ๋ชจ๋ ์ ์ ๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ ์ ์๋ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ๋ํด์ ์์๋ณด์์ต๋๋ค. ์ถ๊ฐ๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ฉฐ ์ฝ๊ฒ ํท๊ฐ๋ฆด ์ ์๋ ๋ถ๋ถ๋ค์ ๋ํด ์ ์ ๋ฆฌ๋ ๊ธ์ด ์์ด์ ํด๋น ๊ธ์ ์ฝ์ด๋ณด์๋ ๊ฒ๋ ์ถ์ฒ๋๋ฆฝ๋๋ค.
์ฐธ๊ณ ์๋ฃ
'๐ Algorithm > ๐ ๊ฐ๋ ์ ๋ฆฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๊ฐ๋ ์ ๋ฆฌ] ํฌ ํฌ์ธํฐ (0) | 2021.04.01 |
---|---|
[๊ฐ๋ ์ ๋ฆฌ] ์ต๋จ๊ฑฐ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ - ํ๋ก์ด๋ ์์ฌ (0) | 2021.03.16 |
[๊ฐ๋ ์ ๋ฆฌ] ์ค์ํ ์๊ณ ๋ฆฌ์ฆ (0) | 2021.02.26 |
[๊ฐ๋ ์ ๋ฆฌ] ์์ด, ์กฐํฉ, ๋ถ๋ถ์งํฉ (0) | 2021.02.19 |
๋๊ธ