白駿-1753:最短経路[java]
最初は排他的に開いていたが、メモリオーバーフローエラーが発生した.
リストに変換して解くため、ノードクラスが作成される.
リストに変換して解くため、ノードクラスが作成される.
import java.io.*;
import java.util.*;
public class Main {
static class Node {
int vertex; // 다음 정점
int distance; // 정점 사이의 거리
public Node(int vertex, int distance) {
this.vertex = vertex;
this.distance = distance;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine().trim());
StringBuilder sb = new StringBuilder();
int V = Integer.parseInt(st.nextToken()); // 정점 개수
int E = Integer.parseInt(st.nextToken()); // 간선 개수
int start = Integer.parseInt(br.readLine()); // 시작 정점
int end = V; // 도착점 인덱스
final int INFINITY = Integer.MAX_VALUE;
List<Node>[] matrix = new ArrayList[V+1]; // 문제에서 정점이 1부터 시작하니까 V+1크기로 생성
// 이거 꼭 해주기
for (int i = 1; i <= V; i++) {
matrix[i] = new ArrayList<>();
}
// int[][] matrix = new int[V+1][V+1];
int[] distance = new int[V + 1];
boolean[] visited = new boolean[V + 1];
for (int i = 0; i < E; i++) {
st = new StringTokenizer(br.readLine().trim(), " ");
int from = Integer.parseInt(st.nextToken());
int to = Integer.parseInt(st.nextToken());
matrix[from].add(new Node(to, Integer.parseInt(st.nextToken())));
}
Arrays.fill(distance, INFINITY);
distance[start] = 0;
int min = 0;
for (int i = 1; i <= V; i++) {
min = INFINITY;
int current = -1;
for (int j = 1; j <= V; j++) {
if (!visited[j] && distance[j] < min) {
min = distance[j];
current = j;
}
}
// 위에서 current 값이 안 바뀌면 -1로 배열 인덱스 오류나고, 선택할 정점이 없다는 뜻
if(current == -1) break;
visited[current] = true; // 선택 정점 방문 처리
for (int c = 0; c < matrix[current].size(); c++) {
Node node = matrix[current].get(c);
// 다음 정점을 방문하지 않았고, 거리가 0이고, 최소거리라면
if (!visited[node.vertex] && node.distance != 0 && distance[node.vertex] > min + node.distance) {
distance[node.vertex] = min + node.distance;
}
}
}
for (int i = 1; i <= V; i++) {
if (distance[i] == INFINITY) sb.append("INF");
else sb.append(distance[i]);
sb.append("\n");
}
sb.setLength(sb.length() - 1);
System.out.println(sb);
br.close();
}
}
Reference
この問題について(白駿-1753:最短経路[java]), 我々は、より多くの情報をここで見つけました https://velog.io/@heoeunah/백준-1753-최단-경로-자바テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol