[백준/Gold V] 최소비용 구하기 - 1916

2024. 11. 28. 10:15·코딩 테스트 정복기/백준
반응형

[Gold V] 최소비용 구하기 - 1916

문제 링크

성능 요약

메모리: 56844 KB, 시간: 512 ms

분류

데이크스트라, 그래프 이론, 최단 경로

제출 일자

2024년 11월 19일 03:29:38

문제 설명

N개의 도시가 있다. 그리고 한 도시에서 출발하여 다른 도시에 도착하는 M개의 버스가 있다. 우리는 A번째 도시에서 B번째 도시까지 가는데 드는 버스 비용을 최소화 시키려고 한다. A번째 도시에서 B번째 도시까지 가는데 드는 최소비용을 출력하여라. 도시의 번호는 1부터 N까지이다.

입력

첫째 줄에 도시의 개수 N(1 ≤ N ≤ 1,000)이 주어지고 둘째 줄에는 버스의 개수 M(1 ≤ M ≤ 100,000)이 주어진다. 그리고 셋째 줄부터 M+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가 주어진다. 그리고 그 다음에는 도착지의 도시 번호가 주어지고 또 그 버스 비용이 주어진다. 버스 비용은 0보다 크거나 같고, 100,000보다 작은 정수이다.

그리고 M+3째 줄에는 우리가 구하고자 하는 구간 출발점의 도시번호와 도착점의 도시번호가 주어진다. 출발점에서 도착점을 갈 수 있는 경우만 입력으로 주어진다.

출력

첫째 줄에 출발 도시에서 도착 도시까지 가는데 드는 최소 비용을 출력한다.

 

 

제출 코드

완전 탐색이 필요한 최소비용 문제는 다익스트라 알고리즘을 사용하여 해결할 수 있다.

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

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


class Node{
    int idx; // 도착노드
    int cost; // 비용
    public Node(int idx, int cost) {
        this.idx = idx;
        this.cost = cost;
    }
}

public class Main {
    static int start, end; // 출발노드, 목적지노드
    static ArrayList<Node>[] graph;
    static Integer[] dist;



    static void dijkstra(){
        PriorityQueue<Node> pq = new PriorityQueue<>((o1, o2) -> o1.cost - o2.cost); // 방문할 노드
        pq.offer(new Node(start, 0)); // 출발 노드 추가
        dist[start] = 0; // 출발 노드 비용 추가

        while(!pq.isEmpty()){
            Node cur = pq.poll(); // 현재 노드
            if(cur.cost > dist[cur.idx]) continue; // 최소비용이 아니면 continue
            if(cur.idx == end) return; // 목적지 도착했으면 return
            if(graph[cur.idx] == null) continue; // 인접 노드 없으면 continue
            for(Node next : graph[cur.idx]){ // 인접 노드 순회
                int nextCost = dist[cur.idx] + next.cost; // 다음 노드 비용 계산
                if(dist[next.idx] == null || nextCost < dist[next.idx]){ // 저장된 최소비용보다 작으면
                    dist[next.idx] = nextCost; // 최소비용바꿔주고
                    pq.offer(new Node(next.idx, nextCost)); // 경로 추가
                }
            }
        }
    }



    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine()); // 노드 개수
        int M = Integer.parseInt(br.readLine()); // 간선 개수
        graph = new ArrayList[N+1]; // 그래프 초기화
        dist = new Integer[N+1]; // 최소비용배열 초기화

        // 입력 받고 그래프 채우기
        StringTokenizer st;
        int s, e, c; // 출발지, 도착지, 비용
        for(int i = 0; i <M ; i++) {
            st = new StringTokenizer(br.readLine());
            s = Integer.parseInt(st.nextToken());
            e = Integer.parseInt(st.nextToken());
            c = Integer.parseInt(st.nextToken());
            if(graph[s] == null) graph[s] = new ArrayList<>();
            graph[s].add(new Node(e, c));
        }

        // 출발노드, 도착노드 저장
        st = new StringTokenizer(br.readLine());
        start = Integer.parseInt(st.nextToken());
        end = Integer.parseInt(st.nextToken());


        // dijkstra 탐색
        dijkstra();

        // 결과 출력
        System.out.println(dist[end]);



    }
}
728x90
반응형

'코딩 테스트 정복기 > 백준' 카테고리의 다른 글

[백준/Silver I] 정수 삼각형 - 1932  (0) 2024.11.30
[백준/Silver I] 곱셈 - 1629  (1) 2024.11.29
[백준/Gold IV] 최단경로 - 1753  (0) 2024.11.27
[백준/Gold IV] 거짓말 - 1043  (0) 2024.11.26
[백준/Silver II] 알고리즘 수업 - 깊이 우선 탐색 1 - 24479  (0) 2024.11.23
'코딩 테스트 정복기/백준' 카테고리의 다른 글
  • [백준/Silver I] 정수 삼각형 - 1932
  • [백준/Silver I] 곱셈 - 1629
  • [백준/Gold IV] 최단경로 - 1753
  • [백준/Gold IV] 거짓말 - 1043
settong
settong
    250x250
  • settong
    개 발 자 국
    settong
  • 전체
    오늘
    어제
    • 전체보기 (202)
      • Computer Science (50)
        • Network (7)
        • Operating System (18)
        • Data Structure (9)
        • Database (11)
        • Algorithm (5)
      • Language (17)
        • Java (17)
        • Javascript (0)
        • Python (0)
      • Devops (20)
        • AWS (0)
        • Naver Cloud (16)
        • CICD (3)
        • 웹 서버 관리 (1)
      • Front (0)
        • React (0)
      • Backend (5)
        • Spring (5)
      • 코딩 테스트 정복기 (110)
        • 백준 (51)
        • 프로그래머스 (53)
        • 기타 (6)
      • etc (0)
      • 경제 상식 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    완전탐색
    집합
    해시
    벨만포드
    분할정복
    백트래킹
    다이나믹프로그래밍
    프로그래머스
    CI/CD
    ncp
    BFS
    Spring Boot
    Network
    ncp202
    DFS
    lcs
    백준
    다익스트라
    github actions
    ncp200
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
settong
[백준/Gold V] 최소비용 구하기 - 1916
상단으로

티스토리툴바