PS/Problems

[Java] 백준 1753번 최단경로 - 다익스트라

CalicoCat22 2022. 1. 8. 04:07

다익스트라의 구현

현재 O(n^2)이므로 O(nlgn)으로 다시 짤 것

내일 플로이드-와셜 알고리즘 공부할 것

package class4;

import java.util.*;
import java.io.*;

public class g5_1753{
    static int[] table;
    static List<Map<Integer, Integer>> map = new ArrayList<>();
    static boolean[] visit;
    public static void main(String[] args){
        FastScanner fs = new FastScanner();
        PrintWriter pw = new PrintWriter(System.out);

        int v = fs.nextInt(), e = fs.nextInt(), k = fs.nextInt() - 1;
        table = new int[v];
        visit = new boolean[v];
        Arrays.fill(table, Integer.MAX_VALUE);
        for (int i=0;i<v;i++) map.add(new HashMap<>());
        
        for (int i=0;i<e;i++){
            int a = fs.nextInt() - 1, b = fs.nextInt() - 1, dis = fs.nextInt();
            if (map.get(a).containsKey(b)){
                map.get(a).put(b, Math.min(map.get(a).get(b), dis));
            }
            else{
                map.get(a).put(b, dis);
            }
        }
        
        table[k] = 0;
        for (Integer i : map.get(k).keySet()){
            table[i] = map.get(k).get(i);
        }
        visit[k] = true;

        for (int i=0;i<v-1;i++){
            int next = nextNode();
            visit[next] = true;
            for (Integer j : map.get(next).keySet()){
                table[j] = Math.min(table[j], table[next] + map.get(next).get(j));
            }
        }

        for (Integer i : table){
            if (i == Integer.MAX_VALUE) pw.println("INF");
            else pw.println(i);
        }
        pw.close();
    }

    static int nextNode(){
        int dis = Integer.MAX_VALUE;
        int index = 0;
        for (int i=0;i<table.length;i++){
            if (table[i] < dis && !visit[i]){
                dis = table[i];
                index = i;
            }
        }
        return index;
    }

    static void sort(int[] a){
        ArrayList<Integer> L = new ArrayList<>();
        for (int i : a) L.add(i);
        Collections.sort(L);
        for (int i = 0; i < a.length; i++) a[i] = L.get(i);
    }

    static class FastScanner{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer("");
        String next(){
            while (!st.hasMoreTokens()){
                try{
                    st = new StringTokenizer(br.readLine());
                }catch (IOException e){
                    e.printStackTrace();
                }
            }
            return st.nextToken();
        }

        int nextInt(){
            return Integer.parseInt(next());
        }

        int[] readArray(int n){
            int[] a = new int[n];
            for (int i = 0; i < n; i++) a[i] = nextInt();
            return a;
        }

        long nextLong(){
            return Long.parseLong(next());
        }
    }
}