๐ [๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ ํ์ด] Q.1753 ์ต๋จ ๊ฒฝ๋ก
๐ ๋ฌธ์
https://www.acmicpc.net/problem/1753
๋ฐฉํฅ๊ทธ๋ํ๊ฐ ์ฃผ์ด์ง๋ฉด ์ฃผ์ด์ง ์์์ ์์ ๋ค๋ฅธ ๋ชจ๋ ์ ์ ์ผ๋ก์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
๋จ, ๋ชจ๋ ๊ฐ์ ์ ๊ฐ์ค์น๋ 10 ์ดํ์ ์์ฐ์์ด๋ค.
๐ ์ ๊ทผ๋ฒ
BOJ Q.1753 ์ต๋จ๊ฑฐ๋ฆฌ ๋ฌธ์ ์ ๋๋ค.
ํ๋์ ์์์ ์์ ๋ค๋ฅธ ๋ชจ๋ ์ ์ ์ผ๋ก์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ ๋๋ค
์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ ์ค ๋ํ์ ์ธ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํ์ด๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํ์ฌ ๊ฒฝ๋ก ์ค์์ ๊ฐ์ฅ ์งง์ ๋น์ฉ์ ์ ์ ์ผ๋ก ํ๋ ์ฉ ๋ฐฉ๋ฌธํด๊ฐ๋ฉฐ
์๋ก์ด ์ ์ ์ ํตํด ๊ฒฝ๋ก๊ฐ ๋ ์งง์์ง๋ค๋ฉด ์ต์ ๊ฒฝ๋ก๋ก ๊ฐฑ์ ํด์ค๋๋ค.
//๋ชฉ์ ์ง ์งํ , ํ์ฌ๊น์ง ๊ฑฐ๋ฆฌ + ํ์ฌ์์ ๋ชฉ์ ์ง ๊ฑฐ๋ฆฌ
if(distance[destination.index] > distance[current.index] + destination.distance) {
// ์ต์ ๊ฑฐ๋ฆฌ ๋น์ฉ ๊ฐฑ์
distance[destination.index] = distance[current.index] + destination.distance;
priorityQueue.add(new Node(destination.index, distance[destination.index]));
}
์ฐ์ ์์ ํ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ฌ ๊ฒฝ๋ก ์ค ๊ฐ์ฅ ์งง์ ๋น์ฉ์ ์ ์ ์ ๋ฐ๋ก ์ฐพ์ ์ ์์ต๋๋ค.
์ฒ์์๋ ์ธ์ ํ๋ ฌ๋ก ํ์๋๋ฐ ์ ์ ์ ๊ฐ์๊ฐ ์ต๋ 2๋ง๊ฐ ๊น์ง์ฌ์
๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ๊ฐ ๋ฌ์๊ณ ์ธ์ ๋ฆฌ์คํธ๋ฅผ ํตํด ํด๊ฒฐํ์์ต๋๋ค.
๐ป ์ฝ๋
package problem.shortestpath.Q1753;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.PriorityQueue;
public class Main_1753 {
static final int INF = Integer.MAX_VALUE;
static int V, E, start;
static List<List<Node>> adList;
static int[] distance;
static boolean[] visited;
static PriorityQueue<Node> priorityQueue;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input[] = br.readLine().split(" ");
V = Integer.parseInt(input[0]);
E = Integer.parseInt(input[1]);
start = Integer.parseInt(br.readLine());
adList = new ArrayList<>();
// ์ธ๋ฑ์ค๋ฅผ 1๋ถํฐ ํ๊ธฐ ์ํด์ ํ ๊ฐ๋ฅผ ๋ฃ์ด๋
adList.add(new<Node> ArrayList());
for(int i = 1; i<= V; i++) {
adList.add(new<Node> ArrayList());
}
distance = new int[V +1];
Arrays.fill(distance, INF);
for(int i=0; i<E; i++) {
String[] temp = br.readLine().split(" ");
int u = Integer.parseInt(temp[0]);
int v = Integer.parseInt(temp[1]);
int cost = Integer.parseInt(temp[2]);
adList.get(u).add(new Node(v, cost));
}
solve(start);
for (int i = 1; i <= V; i++) {
if(distance[i] == INF){
System.out.println("INF");
}
else {
System.out.println(distance[i]);
}
}
}
private static void solve(int start) {
priorityQueue = new PriorityQueue<>();
visited = new boolean[V +1];
distance[start] = 0;
priorityQueue.add(new Node(start, 0));
while(!priorityQueue.isEmpty()) {
Node current = priorityQueue.poll();
if(visited[current.index]){
continue;
}
visited[current.index] = true;
// ์ฐ๊ฒฐ๋ ์ ์ ๋ค์ ํ์ธ
for(Node destination : adList.get(current.index)) {
//๋ชฉ์ ์ง ์งํ , ํ์ฌ๊น์ง ๊ฑฐ๋ฆฌ + ํ์ฌ์์ ๋ชฉ์ ์ง ๊ฑฐ๋ฆฌ
if(distance[destination.index] > distance[current.index] + destination.distance) {
// ์ต์ ๊ฑฐ๋ฆฌ ๋น์ฉ ๊ฐฑ์
distance[destination.index] = distance[current.index] + destination.distance;
priorityQueue.add(new Node(destination.index, distance[destination.index]));
}
}
}
}
}
class Node implements Comparable<Node>{
int index;
int distance;
public Node(int index, int distance) {
this.index = index;
this.distance = distance;
}
@Override
public int compareTo(Node target) {
// ์์ ๊ฑฐ๋ฆฌ ๋น์ฉ์ด ๋จผ์ ์ค๋๋ก
return this.distance - target.distance;
}
}