개발 블로그
article thumbnail

 

 

아이디어

1. 1 번 노드에서 N 번 노드까지 주어진 두 정점을 반드시 지나치는 경로는 2개가 존재함

    - 1 -> node1 -> node2 -> N

    - 1 -> node2 -> node1 -> N

 

2. 플로이드-워셜 알고리즘을 사용하면 모든 정점 간의 최단 경로를 알 수 있고 이를 활용해
    (1 -> node1) + (node1 -> node2) + (node2 -> N)

    (1 -> node2) + (node2 -> node1) + (node1 -> N)

 

값을 비교해 최단 경로를 출력하면 된다.

 

* 시간복잡도가 O(N^3) 이긴 하지만 N의 최대 크기가 800 이므로 800 * 800 * 800 = 64,000,000 이라 1초라는 제한 조건(보통 연산 1억번)을 통과할 수 있을 것이라 예상했는데 아니었다....ㅎ(1초가 넘었는데 정답 처리된 이유는 뭔지 모르겠음)

 

* 시간을 줄이고 싶다면 우선수위큐를 이용한 다익스트라 알고리즘(시간복잡도 : O(ElogN)을 활용하면 된다.

방향이 없는 그래프이기 때문에 dijkstra(1), dijkstra(N), dijkstra(node1) 을  수행하면 원하는 값을 모두 얻어낼 수 있다.

 

 

풀이코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class _n1504_ {

    static int INF = 200000 * 1000;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        
        int N = Integer.parseInt(st.nextToken());
        int E = Integer.parseInt(st.nextToken());

        int[][] distance = new int[N][N];
        for (int i = 0; i < N; i++) {
            Arrays.fill(distance[i], INF);
            distance[i][i] = 0;
        }

        for (int i = 0; i < E; i++) {
            st = new StringTokenizer(br.readLine());

            int a = Integer.parseInt(st.nextToken()) - 1;
            int b = Integer.parseInt(st.nextToken()) - 1;
            int c = Integer.parseInt(st.nextToken());

            distance[a][b] = distance[b][a] = c;
        }

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

        int node1 = Integer.parseInt(st.nextToken()) - 1;
        int node2 = Integer.parseInt(st.nextToken()) - 1;

        for (int k = 0; k < N; k++) {
            for (int i = 0; i < N; i++) {
                for (int j = 0; j < N; j++) {
                    if (distance[i][j] > distance[i][k] + distance[k][j]) {
                        distance[i][j] = (distance[i][k] + distance[k][j]);
                    }
                }
            }
        }

        int temp1 = distance[0][node1] + distance[node1][node2] + distance[node2][N - 1];
        int temp2 = distance[0][node2] + distance[node2][node1] + distance[node1][N - 1];

        int result = Math.min(temp1, temp2);

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

'Algorithm > 백준 알고리즘' 카테고리의 다른 글

2448번. 별 찍기 - 11  (1) 2024.01.06
1987번. 알파벳  (2) 2024.01.05
1043번. 거짓말  (0) 2024.01.03
5639번. 이진 검색 트리  (1) 2023.12.17
13019번. A를 B로  (1) 2023.11.21
profile

개발 블로그

@하얀.손

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!