본문 바로가기
백준(Java)/23년 9월

[Java] 백준 - 1916번: 최소비용 구하기

by C0MPAS 2023. 9. 8.

9월 8일(금) - 그래프와 순회 (1916번)

 

1916번: 최소비용 구하기

첫째 줄에 도시의 개수 N(1 ≤ N ≤ 1,000)이 주어지고 둘째 줄에는 버스의 개수 M(1 ≤ M ≤ 100,000)이 주어진다. 그리고 셋째 줄부터 M+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그

www.acmicpc.net

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

문제점

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import java.util.StringTokenizer;

public class Main {

    private static final int INF = Integer.MAX_VALUE / 16;
    static int[][] map;
    static int[] distance, visited;
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        int N = Integer.parseInt(br.readLine());
        int M = Integer.parseInt(br.readLine());

        map = new int[N+1][N+1];
        distance = new int[N+1];
        visited = new int[N+1];
        for(int i=0; i<N; i++)
        {
            for(int j=0; j<N; j++)
            {
                map[i][j] = INF;
            }
        }

        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());

            if(map[start][end] > weight)
            {
                map[start][end] = weight;
            }
        }

        st = new StringTokenizer(br.readLine());
        int target_start = Integer.parseInt(st.nextToken());
        int target_end = Integer.parseInt(st.nextToken());

        dijkstra(N, target_start, target_end);

    }

    static void dijkstra(int N, int start, int end){
        for(int i=1; i<=N; i++)
        {
            distance[i] = INF;
        }

        distance[start] = 0;
        for(int i=1; i<=N; i++)
        {
            int min = INF;

            for(int j=1; j<=N; j++)
            {
                if(visited[j] == 0 && min > distance[j])
                {
                    min = distance[j];
                    start = j;
                }
            }

            visited[start] = 1;
            for(int next = 1; next<=N; next++)
            {
                if(map[start][next] != INF && distance[next] > distance[start] + map[start][next])
                {
                    distance[next] = distance[start] + map[start][next];
                }
            }
        }

        System.out.println(distance[end]);
    }
}

1. C언어 풀이 활용하여 작성

-> 예제1을 입력하는 경우, 0이 출력됨

-> 추후 다시 풀어봐야함

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

풀이

(풀이출처 -> https://velog.io/@lifeisbeautiful/Java-백준-1916번-최소비용-구하기-with-자바)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import java.util.*;

public class Main {

    private static final int INF = Integer.MAX_VALUE / 16;
    static List<ArrayList<Node>> list;
    static int distance[];
    static int N;

    static class Node implements Comparable<Node>{
        int nodeNum;
        int weight;

        public Node(int nodeNum, int weight){
            this.nodeNum = nodeNum;
            this.weight = weight;
        }

        @Override
        public int compareTo(Node o)
        {
            return weight - o.weight;
        }
    }

    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        N = Integer.parseInt(br.readLine());
        int M = Integer.parseInt(br.readLine());

        list = new ArrayList<>();
        distance = new int[N+1];
        Arrays.fill(distance, INF);

        for(int i=0; i<=N; i++)
        {
            list.add(new ArrayList<>());
        }

        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());

            list.get(start).add(new Node(end, weight));
        }

        st = new StringTokenizer(br.readLine());

        int target_start = Integer.parseInt(st.nextToken());
        int target_end = Integer.parseInt(st.nextToken());

        System.out.println(dijkstra(target_start, target_end));
    }

    static int dijkstra(int start, int end){
        PriorityQueue<Node> pq = new PriorityQueue<Node>();
        boolean visited[] = new boolean[N+1];

        distance[start] = 0;
        pq.offer(new Node(start, 0));

        while (!pq.isEmpty())
        {
            Node queNode = pq.poll();
            int start_nodeNum = queNode.nodeNum;

            if(!visited[start_nodeNum])
            {
                visited[start_nodeNum] = true;

                for(Node node : list.get(start_nodeNum))
                {
                    if(!visited[node.nodeNum] && distance[node.nodeNum] > (distance[start_nodeNum] + node.weight))
                    {
                        distance[node.nodeNum] = distance[start_nodeNum] + node.weight;
                        pq.offer(new Node(node.nodeNum, distance[node.nodeNum]));
                    }
                }
            }
        }

        return distance[end];
    }
}

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

댓글