[Algorithm] 백준_특정한 최단 경로_1504번 (JAVA)

2025. 3. 20. 19:28·Algorithm

📝문제

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

특정한 최단 경로 1504번

티어: 골드 4

💡풀이

문제 유형

다익스트라

 

걸린 시간

100분

 

시간 복잡도

O((V + E) log V)

 

풀이 방법 도출

  1. bfs로 접근했다가 도저히 답이 안 나와서 다익스트라 알고리즘이라는 힌트를 얻고 풀이를 하였다.
  2. 다익스트라 알고리즘이란 가중치가 있는 그래프에서 최단 거리를 찾기 위한 알고리즘으로, 우선순위 큐를 활용한다.
  3. 해당 문제는 1번 노드에서 시작해 꼭 거쳐야 하는 노드 v1,v2를 지나 n번 노드까지 도착해야한다.
  4. 즉 다익스트라 함수를 구현하여
  5. (1번 -> v1번 노드의 최소 거리) + (v1번 -> v2번 노드의 최소 거리) + (v2번 -> N번 노드의 최소 거리)
  6. 또는
  7. (1번 -> v2번 노드의 최소 거리) + (v2번 -> v1번 노드의 최소 거리) + (v1번 -> N번 노드의 최소 거리)
  8. 중 최솟값이 정답이 된다.
  9. 다익스트라 함수 구현은 다음과 같다.
    1. 경로의 길이를 기준으로 오름차순 정렬을 갖는 우선순위 큐를 선언한다.
    2. 최소 거리를 담는 dist[] 배열을 선언하고 int 최대값으로 초기화한다.
    3. 이때 시작지점은 0으로 초기화한다.
    4. 큐에 현재 노드와 현재 거리 0을 넣고
    5. 큐가 빌 때까지 반복문을 돌린다.
    6. 큐에서 꺼낸 노드(now)와 거리(cost)를 변수에 담고
    7. 현재 노드와 인접한 노드를 찾는다.
    8. 현재 거리와 인접한 노드의 거리의 합이 dist[인접 노드]보다 작다면 dist[인접노드]를 갱신해준다.
    9. 큐에 인접 노드와 인접 노드까지의 거리를 담고 반복한다.

import java.util.*;
import java.io.*;
class Main{
    static int N;
    static ArrayList<Node>[] graph;
    static int INF = Integer.MAX_VALUE;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        int E = Integer.parseInt(st.nextToken());

        graph = new ArrayList[N+1];
        for(int i = 0; i <= N; i++){
            graph[i] = new ArrayList<>();
        }

        for(int i = 0; i < E; i++){
            st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            int c = Integer.parseInt(st.nextToken());

            graph[a].add(new Node(b,c));
            graph[b].add(new Node(a,c));
        }

        st = new StringTokenizer(br.readLine());
        int v1 = Integer.parseInt(st.nextToken());
        int v2 = Integer.parseInt(st.nextToken());

        int[] dist_1 = dijkstra(1);
        int[] dist_v1 = dijkstra(v1);
        int[] dist_v2 = dijkstra(v2);

        long route1 = (long) dist_1[v1] + dist_v1[v2] + dist_v2[N];
        long route2 = (long) dist_1[v2] + dist_v2[v1] + dist_v1[N];

        long answer = Math.min(route1, route2);

        System.out.println(answer >= INF ? -1 : answer);

    }
    public static int[] dijkstra(int start){
        PriorityQueue<Node> pq = new PriorityQueue<>((a,b)->a.d);
        int[] dist = new int[N+1];
        Arrays.fill(dist, INF);
        dist[start] = 0;
        pq.add(new Node(start, 0));

        while(!pq.isEmpty()){
            Node current = pq.poll();
            int now = current.x;
            int cost = current.d;

            for(Node next : graph[now]){
                int newCost = cost + next.d;
                if(newCost < dist[next.x]){
                    dist[next.x] = newCost;
                    pq.add(new Node(next.x, newCost));
                }
            }
        }
        return dist;
    }
}
class Node{
    int x;
    int d;
    public Node(int x, int d){
        this.x = x;
        this.d = d;
    }
}

 

🤔Review

다익스트라 알고리즘 구현에 아직 익숙치 않다,,헷갈리고 어려워ㅠ익숙해지는 그날까지 ㅎㅇㅌ

'Algorithm' 카테고리의 다른 글

[Algorithm] 백준_평범한 배낭_12865번 (JAVA) 🎒  (0) 2025.03.23
[Algorithm] 백준_이중 우선순위 큐_7662번 (JAVA) TreeMap  (0) 2025.03.21
[Algorithm] 백준_수들의 합 5_2018번 (JAVA)  (2) 2025.03.18
[Algorithm] 백준_토마토_7569번 (JAVA) 🍅  (0) 2025.03.18
[Algorithm] 백준_대회 or 인턴_2875번 (JAVA)  (0) 2025.03.04
'Algorithm' 카테고리의 다른 글
  • [Algorithm] 백준_평범한 배낭_12865번 (JAVA) 🎒
  • [Algorithm] 백준_이중 우선순위 큐_7662번 (JAVA) TreeMap
  • [Algorithm] 백준_수들의 합 5_2018번 (JAVA)
  • [Algorithm] 백준_토마토_7569번 (JAVA) 🍅
dev_ajrqkq
dev_ajrqkq
알고리즘 천재가 될 거야
  • dev_ajrqkq
    기록이 자산이다
    dev_ajrqkq
  • 전체
    오늘
    어제
    • 분류 전체보기 (147)
      • Front-end (0)
      • Back-end (11)
        • Spring (1)
        • Java (8)
      • CS (9)
        • 데이터베이스 (5)
        • 네트워크 (4)
      • Algorithm (80)
      • 이것저것 (0)
      • 버그잡기 (1)
      • TIL (37)
      • 후기 (1)
      • 취준 (0)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      개발자취업
      코딩테스트준비
      티스토리챌린지
      오블완
      항해99
      Til
      TypeScript
      99클럽
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.2
    dev_ajrqkq
    [Algorithm] 백준_특정한 최단 경로_1504번 (JAVA)
    상단으로

    티스토리툴바