๐ [๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ ํ์ด] Q.1916 ์ต์๋น์ฉ ๊ตฌํ๊ธฐ
๐ ๋ฌธ์
https://www.acmicpc.net/problem/1916
N๊ฐ์ ๋์๊ฐ ์๋ค. ๊ทธ๋ฆฌ๊ณ ํ ๋์์์ ์ถ๋ฐํ์ฌ ๋ค๋ฅธ ๋์์ ๋์ฐฉํ๋ M๊ฐ์ ๋ฒ์ค๊ฐ ์๋ค.
์ฐ๋ฆฌ๋ A๋ฒ์งธ ๋์์์ B๋ฒ์งธ ๋์๊น์ง ๊ฐ๋๋ฐ ๋๋ ๋ฒ์ค ๋น์ฉ์ ์ต์ํ ์ํค๋ ค๊ณ ํ๋ค.
A๋ฒ์งธ ๋์์์ B๋ฒ์งธ ๋์๊น์ง ๊ฐ๋๋ฐ ๋๋ ์ต์๋น์ฉ์ ์ถ๋ ฅํ์ฌ๋ผ. ๋์์ ๋ฒํธ๋ 1๋ถํฐ N๊น์ง์ด๋ค.
๐ ์ ๊ทผ๋ฒ
BOJ Q.1916 ์ต๋จ๊ฑฐ๋ฆฌ ๋ฌธ์ ์ ๋๋ค.
ํ๋์ ์์์ ์์ ๋ชฉํ ์ง์ ๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ ๋๋ค.
์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ ์ค ๋ํ์ ์ธ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํ์ด๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํ์ฌ ๊ฐ ์ ์๋ ๊ฒฝ๋ก ์ค์์ ๊ฐ์ฅ ์งง์ ๋น์ฉ์ ์ ์ ์ผ๋ก ํ๋ ์ฉ ๋ฐฉ๋ฌธํด๊ฐ๋ฉฐ
์๋ก์ด ์ ์ ์ ํตํด ๊ฒฝ๋ก๊ฐ ๋ ์งง์์ง๋ค๋ฉด ์ต์ ๊ฒฝ๋ก๋ก ๊ฐฑ์ ํด์ค๋๋ค.
์์์ง๋ก๋ถํฐ์ ๋ชจ๋ ์ ์ ์ ๋ํ ์ต์๊ฒฝ๋ก๋ฅผ ๊ตฌํ์ฌ
์์์ง๋ก๋ถํฐ ๋์ฐฉ์ง๊น์ง์ ์ต์ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ ์ ์์ต๋๋ค.
//๋ชฉ์ ์ง ์งํ , ํ์ฌ๊น์ง ๊ฑฐ๋ฆฌ + ํ์ฌ์์ ๋ชฉ์ ์ง ๊ฑฐ๋ฆฌ
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]));
}
๐ป ์ฝ๋
package problem.shortest.Q1916;
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_1916 {
static final int INF = 987654321;
static int V, E, start,end;
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));
V = Integer.parseInt(br.readLine());
E = 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());
}
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));
}
String temp[] = br.readLine().split(" ");
start = Integer.parseInt(temp[0]);
end = Integer.parseInt(temp[1]);
solve(start);
if (distance[end] == INF) {
System.out.println("INF");
} else {
System.out.println(distance[end]);
}
}
private static void solve(int start) {
priorityQueue = new PriorityQueue<>();
visited = new boolean[V +1];
distance = new int[V + 1];
Arrays.fill(distance, INF);
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;
}
}