알고리즘
[Java] 백준 1753번 최단경로
J3SUNG
2023. 3. 4. 17:21
728x90
방향그래프가 주어졌을 때 시작점을 기준으로 모든 정점들과의 최단 경로를 구하는 문제입니다.
다익스트라 알고리즘을 사용했습니다.
우선순위큐를 사용해서 시작점으로 부터 짧은 정점들을 우선으로 탐색합니다.
탐색한 후 (해당 경로에 저장되어 있는 거리값)과 (현재 위치에 저장되어 있는 거리값 + 현재위치에서 해당위치까지의 거리 값)을 비교해서 작은 값을 넣어줍니다.
위의 방식을 통해서 모든 위치에 대하여 거리값을 갱신해줍니다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
ArrayList<ArrayList<Pair>> al = new ArrayList<>();
PriorityQueue<Pair> pq = new PriorityQueue<>((a, b)-> a.num - b.num);
int v = Integer.parseInt(st.nextToken());
int e = Integer.parseInt(st.nextToken());
int s = Integer.parseInt(br.readLine());
int[] dis = new int[v+1];
for(int i=0; i<=v; ++i) {
ArrayList<Pair> temp = new ArrayList<>();
al.add(temp);
dis[i] = 987654321;
}
for(int i=0; i<e; ++i) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
al.get(a).add(new Pair(b, c));
}
dis[s] = 0;
pq.add(new Pair(s, dis[s]));
while(!pq.isEmpty()) {
Pair cur = pq.poll();
for(int i=0; i<al.get(cur.ver).size(); ++i) {
int next = al.get(cur.ver).get(i).ver;
int nextDis = al.get(cur.ver).get(i).num;
if(dis[next] > dis[cur.ver] + nextDis) {
dis[next] = dis[cur.ver] + nextDis;
pq.add(new Pair(next, dis[next]));
}
}
}
for(int i=1; i<=v; ++i) {
bw.write(dis[i]==987654321?"INF\n":dis[i] + "\n");
}
bw.close();
}
public static class Pair {
public int ver;
public int num;
Pair(int ver, int num) {
this.ver = ver;
this.num = num;
}
}
}