import java.util.PriorityQueue;
class Solution {
static int INF = 987654321;
static int MAX_N = 6;
static class Pair implements Comparable<Pair>{
int x, y;
Pair(int x, int y){
this.x = x;
this.y = y;
}
@Override
public int compareTo(Pair o) {
if (o.x == this.x) return this.y - o.y;
else return this.x - o.x;
}
}
static int graph()() = new int()(){
{0,2,5,1,INF,INF},
{2,0,3,2,INF,INF},
{5,3,0,3,1,5},
{1,2,3,0,1,INF},
{INF,INF,1,1,0,2},
{INF,INF,5,INF,2,0}
};
static int getMinIdx(int nodes(), boolean visited()){
int min = -1;
for(int i=0;i< MAX_N;i++){
if(visited(i)) continue;
if(min<0 || nodes(min) > nodes(i)) min = i;
}
return min;
}
static void dijkstra(int arr()(), int start, int dist()){
// Priority Queue(Heap)를 이용한 구현 O(NlogN)
PriorityQueue<Pair> pq = new PriorityQueue<>();
for(int i=0;i< MAX_N;i++){
dist(i) = INF;
}
pq.add(new Pair(0, start)); // {dist, destination}
while(!pq.isEmpty()){
int cur_dist = -pq.peek().x;
int cur_node = pq.peek().y;
pq.poll();
for(int i=0;i< MAX_N;i++){
int nxt_dist = cur_dist + arr(cur_node)(i);
if(nxt_dist < dist(i))
{
dist(i) = nxt_dist;
pq.add(new Pair(-nxt_dist,i));
}
}
}
}
static void dijkstra2(int arr()(), int start, int dist()){
// 선형 탐색으로 구현 O(N^2)
boolean visited() = new boolean(MAX_N);
for(int i=0;i< MAX_N;i++){
dist(i) = arr(start)(i);
}
visited(start) = true;
for(int i=0;i< MAX_N-1;i++){
int n_new = getMinIdx(dist,visited);
visited(n_new) = true;
for(int j=0;j< MAX_N;j++){
if(visited(j)) continue;
if(dist(j) > dist(n_new) + arr(n_new)(j))
dist(j) = dist(n_new) + arr(n_new)(j);
}
}
}
public static void main(String args()) throws Exception {
int dist() = new int(MAX_N);
int start = 0;
dijkstra2(graph,start,dist);
// dijkstra(graph,start,dist);
for(int i=0;i< MAX_N;i++){
System.out.printf("%d->%d : %d\n", start, i, dist(i));
}
System.out.println();
return;
}
}