白駿-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();
	}
}