기존 최단 거리와 동일한 거리로 다른 경로가 존재하는지 판단
기존 다익스트라와 동일하게 수행하며
까지 최단 경로는 dist[N]에 저장되어 있습니다.
그러나 이 최단 경로를 다른 경로로 탐색한 경우가 있는지 확인하기 위해서는
vis 배열을 추가해서 현재 측정된 최단 경로로 몇 개의 경로가 올 수 있는지를 저장해
새로운 경로로 이동할 때 현재 최단 경로와 같은지(dist[nv] == nw) 파악하고
기존 경로vis[nv] += vis[v]를 누적하는 로직을 추가했습니다.
import java.io.*;
import java.util.*;
class Edge implements Comparable<Edge> {
int v;
int w;
public Edge(int v, int w) {
this.v = v;
this.w = w;
}
@Override
public int compareTo(Edge o) {
return this.w - o.w;
}
}
public class Main {
static final int MAX = 2000000000;
static StringTokenizer st;
static ArrayList<Edge>[] graph;
static int[] dist;
static int[] vis;
static int N, M, K;
public static void main(String[] args) throws IOException {
init();
System.out.println(dijkstra());
}
static void init() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
for (int i = 0; i < K; i++) st.nextToken();
graph = new ArrayList[N + 1];
for (int i = 1; i <= N; i++) graph[i] = new ArrayList<>();
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int u = Integer.parseInt(st.nextToken());
int v = Integer.parseInt(st.nextToken());
int w = Integer.parseInt(st.nextToken());
graph[u].add(new Edge(v, w));
graph[v].add(new Edge(u, w));
}
dist = new int[N + 1];
vis = new int[N + 1];
Arrays.fill(dist, MAX);
}
static String dijkstra() {
PriorityQueue<int[]> pq = new PriorityQueue<>(Comparator.comparingInt(a -> a[1]));
dist[1] = 0;
vis[1] = 1;
pq.offer(new int[]{1, 0});
while (!pq.isEmpty()) {
int[] cur = pq.poll();
int v = cur[0];
int d = cur[1];
if (dist[v] < d) continue;
for (Edge next : graph[v]) {
int nv = next.v;
int nd = d + next.w;
if (dist[nv] > nd) {
dist[nv] = nd;
vis[nv] = vis[v];
pq.offer(new int[]{nv, nd});
}
else if (dist[nv] == nd) {
vis[nv] = Math.min(2, vis[nv] + vis[v]);
}
}
}
return vis[N] >= 2 ? "yes" : "no";
}
}