알고리즘

백준 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;
    }

}

'알고리즘' 카테고리의 다른 글

백준 13335번 트럭 (JAVA)  (0) 2023.11.16
백준 1202번 보석 도둑 (JAVA)  (0) 2023.11.15
백준 1655번 가운데를 말해요 (JAVA)  (0) 2023.11.13
백준 11399번 ATM (JAVA)  (0) 2023.11.12
백준 2805번 나무 자르기 (JAVA)  (1) 2023.11.11