https://www.acmicpc.net/problem/17396
import java.io.*;
import java.util.*;
class Node implements Comparable<Node> {
int idx;
long cost;
// 생성자
Node(int idx, long cost) {
this.idx = idx;
this.cost = cost;
}
@Override
public int compareTo(Node other) {
return Long.compare(this.cost, other.cost);
}
}
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int[] visibility = new int[N];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
visibility[i] = Integer.parseInt(st.nextToken());
}
// 인접 리스트 사용
List<List<Node>> graph = new ArrayList<>();
for (int i = 0; i < N; i++) {
graph.add(new ArrayList<>()); //삽입
}
// N개의 경로 입력
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken()); //시작
int y = Integer.parseInt(st.nextToken()); //도착
long length = Long.parseLong(st.nextToken()); //길이(가중치)
graph.get(x).add(new Node(y, length)); // x에서 y로 가는 간선
graph.get(y).add(new Node(x, length)); // y에서 x로 가는 간선 (양방향)
}
int start = 0;
int end = N-1;
// 최단 거리 저장 배열
long[] dist = new long[N];
Arrays.fill(dist, Long.MAX_VALUE);
dist[start] = 0; // 출발지의 거리 초기화
// 우선순위 큐 사용
PriorityQueue<Node> q = new PriorityQueue<>();
q.add(new Node(start, 0)); //출발지 정점과 가중치를 우선순위 큐에 넣음
// // 방문 여부를 체크할 배열
// boolean[] visited = new boolean[N + 1];
while (!q.isEmpty()) { //큐에 값이 하나도 없을때까지 반복
Node now = q.poll(); //큐에서 앞에 있는 노드 반환 및 삭제 (현재 큐에 있는 값 중 출발지로부터 가장 가까운 거리)
int nowIdx = now.idx;
// if (visited[nowIdx]) //방문했던 노드라면 패스
// continue;
// visited[nowIdx] = true; //방문했다고 표시
if (dist[nowIdx] < now.cost) { //해당 노드에 대한 distance값은 여러번 갱신될 수 있어서 큐에 자주 들어갈 수있지만, 한번 방문됐다면 distance의 값은 최소값이다.
continue;//distance의 값이 더 작으니까 볼 필요없다 -> 이미 방문된 노드이다.
}
for (Node neighbor : graph.get(nowIdx)) {
// 상대의 시야에 있는 분기점이면 건너뜁니다.
if (visibility[neighbor.idx] != 0 && neighbor.idx != end) {
continue;
}
if (dist[neighbor.idx] > (dist[nowIdx] + neighbor.cost)) {
dist[neighbor.idx] = dist[nowIdx] + neighbor.cost;
q.add(new Node(neighbor.idx, dist[neighbor.idx]));
}
}
}
// 도착 도시까지의 최단 거리 출력
if (dist[end] == Long.MAX_VALUE) {
System.out.println(-1);
} else {
System.out.println(dist[end]);
}
}
}
주의할 점
거리(가중치) 저장 시 int가 아닌 long!