티스토리 뷰

알고리즘

[백준] 1976. 여행가자 (Java)

melthleeth 2021. 8. 9. 14:02

 

 

1976번: 여행 가자

동혁이는 친구들과 함께 여행을 가려고 한다. 한국에는 도시가 N개 있고 임의의 두 도시 사이에 길이 있을 수도, 없을 수도 있다. 동혁이의 여행 일정이 주어졌을 때, 이 여행 경로가 가능한 것인

www.acmicpc.net

 

풀이

  • 다양한 방법이 있는 것 같지만 다익스트라로 풀었다.
  • 우선 여행 계획에 있는 도시들은 중복될 수 있으므로 순서를 배열로 입력받음과 동시에 HashSet으로 받았다.
  • HashSet에 있는 도시들만 다익스트라 알고리즘으로 경로를 갱신했다.
    • 만약 위치가 INF로 남아있으면 그 도시로는 방문이 불가능하다는 의미이다.
  • 마지막으로 여행 계획에 있는 도시들을 for문으로 순회하면서 INF가 나오면 바로 "NO"를, 그렇지 않으면 "YES"를 출력하게 했다.

 

코드

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

public class Main {
    static int N, M;
    static String ans = "YES";
    static int[][] adj, dist;
    static int[] route;
    static Set<Integer> cities = new HashSet<>();
    static final int INF = 40000;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;
        N = Integer.parseInt(br.readLine());
        M = Integer.parseInt(br.readLine());
        adj = new int[N + 1][N + 1];
        dist = new int[N + 1][N + 1];
        route = new int[M];

        for (int i = 1; i <= N; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 1; j <= N; j++)
                adj[i][j] = Integer.parseInt(st.nextToken());
        }

        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < M; i++) {
            int city = Integer.parseInt(st.nextToken());
            cities.add(city);
            route[i] = city;
        }

        for (Integer city : cities) {
            Arrays.fill(dist[city], INF);
            Dijkstra(city);
        }

        for (int i = 0; i < M - 1; i++) {
            int from = route[i];
            int to = route[i + 1];

            if (dist[from][to] == INF) {
                ans = "NO";
                break;
            }
        }

        bw.write(ans);
        br.close();
        bw.close();
    }

    public static void Dijkstra(int idx) {
        dist[idx][idx] = 0;
        Queue<Integer> q = new LinkedList<>();
        q.offer(idx);

        while(!q.isEmpty()) {
            int from = q.poll();

            for (int to = 1; to <= N; to++) {
                if (adj[from][to] == 0) continue;
                if (dist[idx][from] + adj[from][to] < dist[idx][to]) {
                    dist[idx][to] = dist[idx][from] + adj[from][to];
                    q.offer(to);
                }
            }
        }
    }
}

 

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

[백준] 9019. DSLR (Java)  (0) 2021.08.16
[백준] 19238. 스타트 택시 (Java)  (0) 2021.08.16
[백준] 1939. 중량제한 (Java)  (0) 2021.07.29
[백준] 15684. 사다리 조작 (Java)  (0) 2021.07.23
[백준] 11559. Puyo Puyo (Java)  (0) 2021.07.23
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함