알고리즘

백준 1753번 최단경로 (JAVA)

박카스마시며코딩 2023. 11. 14. 20:40

https://www.acmicpc.net/problem/1753

 

1753번: 최단경로

첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1 ≤ V ≤ 20,000, 1 ≤ E ≤ 300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다. 둘째 줄에는 시작 정점의 번호 K(1 ≤ K ≤ V)가

www.acmicpc.net

 

저는 다익스트라를 통해 문제를 해결하였습니다.

다익스트라를 통해 시작점에서 각각의 지점까지 최단경로를 찾아 문제를 해결하였습니다.

 

package BOJ.mst;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.StringTokenizer;

public class BOJ_1753 {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        List<int[]>[] edges = new List[n+1];
        for(int i = 0 ; i <= n ; i++){
            edges[i] = new LinkedList<>();
        }
        int k = Integer.parseInt(br.readLine());
        for(int i = 0 ; i < m ; i++){
            st = new StringTokenizer(br.readLine());
            int start = Integer.parseInt(st.nextToken());
            int end = Integer.parseInt(st.nextToken());
            int weight = Integer.parseInt(st.nextToken());
            edges[start].add(new int[]{end,weight});
        }
        int[] distance = cal(edges,k,n);
        StringBuilder sb = new StringBuilder();
        for(int i = 1 ; i <= n ; i++){
            if(distance[i] == INF){
                sb.append("INF\n");
            }else{
                sb.append(distance[i]+"\n");
            }
        }
        System.out.println(sb.toString());
    }
    private static final int INF = 987654321;

    private static int[] cal(List<int[]>[] edges, int start,int n) {
        int[] distance = new int[n+1];
        Arrays.fill(distance,INF);
        distance[start] = 0;
        boolean[]visited = new boolean[n+1];
        for(int i = 0 ; i < n ; i++){
            int minValue = INF;
            int minIndex = 0;
            for(int j = 1 ; j <= n ; j++){
                if(!visited[j] && minValue > distance[j]){
                    minIndex = j;
                    minValue = distance[j];
                }
            }
            visited[minIndex] = true;
            if(minIndex == 0){
                break;
            }
            for(int[] next : edges[minIndex]){
                if(!visited[next[0]] && distance[next[0]] > minValue + next[1]){
                    distance[next[0]] = minValue + next[1];
                }
            }
        }
        return distance;
    }

}