> 문제
> 문제풀이
최단거리 문제로 다익스트라 알고리즘을 활용하였다.
플로이드 와샬( O(V^3) )로도 풀 수 있지만 아무래도 우선순위 큐 다익스트라( O(ElogV) )가 훨씬 빠른 듯 하다.
세 정점 A, B, S에서의 최단거리를 구하였다.
소스는 다음과 같다.
import java.util.*;
class Solution {
static int N;
static int[] aNodes, bNodes, sNodes;
static int[][] map;
static void dijkstra(int start, int[] nodes, int[][] map){
boolean[] visit = new boolean[N+1];
Queue<Dist> pq = new PriorityQueue<>();
pq.add(new Dist(start, 0));
nodes[start] = 0;
while(!pq.isEmpty()){
Dist d = pq.poll();
if(visit[d.n]) continue;
visit[d.n] = true;
for(int i=1; i<map[d.n].length; i++){
if(!visit[i] && map[d.n][i] > 0 && nodes[i] > nodes[d.n] + map[d.n][i]){
nodes[i] = nodes[d.n] + map[d.n][i];
pq.add(new Dist(i, nodes[i]));
}
}
}
}
static public int solution(int n, int s, int a, int b, int[][] fares) {
N = n;
map = new int[N+1][N+1];
aNodes = new int[N+1];
bNodes = new int[N+1];
sNodes = new int[N+1];
for(int i=0; i<fares.length; i++){
map[fares[i][0]][fares[i][1]] = fares[i][2];
map[fares[i][1]][fares[i][0]] = fares[i][2];
}
for(int i=1; i<=N; i++){
aNodes[i] = Integer.MAX_VALUE;
bNodes[i] = Integer.MAX_VALUE;
sNodes[i] = Integer.MAX_VALUE;
}
dijkstra(a, aNodes, map);
dijkstra(b, bNodes, map);
dijkstra(s, sNodes, map);
int answer = Integer.MAX_VALUE;
for(int i=1; i<=N; i++){
answer = Math.min(aNodes[i] + bNodes[i] + sNodes[i], answer);
}
return answer;
}
static class Dist implements Comparable<Dist>{
int n, v;
public Dist(int n, int v){
this.n=n;
this.v=v;
}
@Override
public int compareTo(Dist o) {
return this.v - o.v;
}
}
}
문제 출처 : Programmers