풀이
다익스트라(Dijkstra) 알고리즘을 활용하여 최단 경로를 구하는 코드입니다. 다익스트라 알고리즘은 시작 노드에서부터 다른 모든 노드까지의 최단 경로를 찾는 데 사용됩니다.
public class Main {
// 간선 정보를 저장하기 위한 클래스
static class Edge implements Comparable<Edge>{
int end, weight;
public Edge(int end, int weight){
this.end = end;
this.weight = weight;
}
// 가중치 값에 따라 정렬
@Override
public int compareTo(Edge o) {
return weight - o.weight;
}
}
private static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
private static final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
// v : 노드의 개수, e : 간선의 개수, k : 시작 노드 번호
static int v,e,k;
static List<Edge>[] list;
// 시작 노드에서부터 해당 노드까지의 최단 거리를 저장하는 배열
static int[] minEdge;
public static void main(String[] args) throws IOException {
StringTokenizer st = new StringTokenizer(br.readLine());
v = Integer.parseInt(st.nextToken());
e = Integer.parseInt(st.nextToken());
k = Integer.parseInt(br.readLine());
list = new ArrayList[v + 1];
minEdge = new int[v + 1];
Arrays.fill(minEdge, Integer.MAX_VALUE);
for(int i = 1; i <= v; i++){
list[i] = new ArrayList<>();
}
for(int i = 0 ; i < e; i++){
st = new StringTokenizer(br.readLine());
int start = Integer.parseInt(st.nextToken());
int end = Integer.parseInt(st.nextToken());
int weight = Integer.parseInt(st.nextToken());
list[start].add(new Edge(end, weight));
}
StringBuilder sb = new StringBuilder();
dijkstra(k);
for(int i = 1; i <= v; i++){
if(minEdge[i] == Integer.MAX_VALUE) sb.append("INF\n");
else sb.append(minEdge[i] + "\n");
}
bw.write(sb.toString());
bw.close();
br.close();
}
private static void dijkstra(int start){
// 정렬
PriorityQueue<Edge> queue = new PriorityQueue<>();
boolean[] visited = new boolean[v + 1];
queue.add(new Edge(start, 0));
minEdge[start] = 0;
while(!queue.isEmpty()){
Edge curEdge = queue.poll();
int cur = curEdge.end;
if(visited[cur]) continue;
visited[cur] = true;
for(Edge e : list[cur]){
if(minEdge[e.end] > minEdge[cur] + e.weight){
minEdge[e.end] = minEdge[cur] + e.weight;
queue.add(new Edge(e.end, minEdge[e.end]));
}
}
}
}
}
minEdge[] = {INF, INF, INF, INF, INF}; // 모든 값을 무한대로 저장(최대값)
-> {0, INF, INF, INF, INF}; // 시작 지점을 0으로 지정
-> {0, 2(0+2), 3(0+3), INF, INF} // 1에서 갈 수 있는 노드들의 값 변경
-> {0, 2, 3, 7(2+5), INF} // 2에서 4로 갈때는 2+5<INF 이므로 변경
-> {0, 2, 3, 7, INF} // 3에서 4로 갈때는 3+6<7을 만족하지 않으므로 변경 x
입력 값
5 6
1
5 1 1
1 2 2
1 3 3
2 3 4
2 4 5
3 4 6
'코딩 테스트' 카테고리의 다른 글
[SWEA : JAVA] 1251 하나로 (MST, Prim 알고리즘) (0) | 2023.08.29 |
---|---|
[백준 : JAVA] 1929 소수 구하기 (0) | 2023.01.31 |
[백준 : JAVA] 4158 CD (0) | 2023.01.23 |
[백준 : JAVA] 2161 카드1 (0) | 2023.01.22 |
[백준 : JAVA] 9093 단어 뒤집기 (0) | 2023.01.18 |