λ¬Έμ μμ μꡬνλ λ΅μ κ°λ΅νκ² νννλ©΄,
(μΆλ°μ§μ → κ²½μ μ§μ ) μκΈ + (κ²½μ μ§μ → λ¬΄μ§ λͺ©μ μ§) μκΈ + (κ²½μ μ§μ → μ΄νΌμΉ μ§μ ) μκΈ = μ΅μ’ μκΈ
μ μμΌλ‘λΆν° ꡬν΄μ§ μ΅μ’ μκΈμ μ΅μκ°μ λ΅μΌλ‘ μΆλ ₯νλ©΄ λλ€.
μ²μμ νΌ λ°©μμ μκ° μ΄κ³Όκ° κ³μ λ°μνλλ°
for(int i=1;i<=n;i++){
answer = Math.min(answer,dijk(s,i)+dijk(i,a)+dijk(i,b));
}
μμ κ°μ΄, λ€μ΅μ€νΈλΌ μκ³ λ¦¬μ¦μ 루νλ¬Έλ§λ€ 3λ²μ© μ¬μ©νκ³ μμλ€.
λ€μ μκ°ν΄λ³΄λ,
μΆλ°μ§μ → κ²½μ μ§μ μκΈ μ 보λ λ€μ΅μ€νΈλΌ μκ³ λ¦¬μ¦μ νλ²λ§ μνν΄μ ꡬν μ μκ³
(κ²½μ μ§μ → λ¬΄μ§ λͺ©μ μ§) μκΈ + (κ²½μ μ§μ → μ΄νΌμΉ μ§μ )μκΈ μμ λ€μ΅μ€νΈλΌ μκ³ λ¦¬μ¦ νλ² μννλ©΄ λ μ 보λ₯Ό μ»μ μ μλ€.
λ€λ§ κ²½μ μ§μ λ§λ€ λ€ κ΅¬ν΄λ΄μΌ νκΈ° λλ¬Έμ, forλ¬Έμ ν΅ν΄μ κ²½μ μ§μ λ³ μκΈ μ 보λ₯Ό ꡬν΄μΌνλ€.
λ°λΌμ μλμ κ°μ΄ λ‘μ§μ λ³κ²½νλ, λ€μ΅μ€νΈλΌ μκ³ λ¦¬μ¦ μ¬μ© νμλ₯Ό μ€μΌ μ μμκ³ μκ°μ ν μ΄κ³Ό μμ΄ ν΅κ³Όν μ μμλ€.
int[] result1 = dijk(s);
for(int i=1;i<=n;i++){
int[] result2 = dijk(i);
answer = Math.min(answer,result1[i-1]+result2[a-1]+result2[b-1]);
}
import java.util.*;
class Solution {
final int MAX = 20000001;
int n;
int[][] g;
int[] dist;
boolean[] checked;
PriorityQueue<int[]> pq;
public int solution(int n, int s, int a, int b, int[][] fares) {
int answer = MAX;
setUp(n,fares);
int[] result1 = dijk(s);
for(int i=1;i<=n;i++){
int[] result2 = dijk(i);
answer = Math.min(answer,result1[i-1]+result2[a-1]+result2[b-1]);
}
return answer;
}
int[] dijk(int start){
pq = new PriorityQueue<>((a,b)->a[0]-b[0]);
dist = new int[n];
checked = new boolean[n];
Arrays.fill(dist,MAX);
dist[start-1] = 0;
pq.offer(new int[]{dist[start-1],start-1});
while(!pq.isEmpty()){
int[] info = pq.poll();
int u = info[1];
if(checked[u]){
continue;
}
checked[u]=true;
for(int v=0;v<n;v++){
if(dist[v]>dist[u]+g[u][v]){
dist[v]=dist[u]+g[u][v];
pq.offer(new int[]{dist[v],v});
}
}
}
return dist;
}
void setUp(int n,int[][] fares){
this.n=n;
g = new int[n][n];
for(int r=0;r<n;r++){
for(int c=0;c<n;c++){
if(r==c){
g[r][c]=0;
}else{
g[r][c]=MAX;
}
}
}
for(int r=0;r<fares.length;r++){
int[] fare = fares[r];
for(int c=0;c<n;c++){
g[fare[0]-1][fare[1]-1]=fare[2];
g[fare[1]-1][fare[0]-1]=fare[2];
}
}
}
}