본문 바로가기

CodingTEST

[백준 11404] 플로이드(JAVA)

반응형

백준 11404번 문제 - 플로이드

 

11404번: 플로이드

첫째 줄에 도시의 개수 n이 주어지고 둘째 줄에는 버스의 개수 m이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가

www.acmicpc.net


문제 분석 

 

 

  • n(2 ≤ n ≤ 100)개의 도시가 있다.
  • 한 도시에서 출발하여 다른 도시에 도착하는 m(1 ≤ m ≤ 100,000)개의 버스가 있다.
    • 각 버스는 한 번 사용할 때 필요한 비용이 있다.
  • 모든 도시의 쌍 (A, B)에 대해서 도시 A에서 B로 가는데 필요한 비용의 최솟값을 구하는 프로그램을 작성

해결 포인트

 

  • 플로이드–워셜 알고리즘 이용 (사실 BFS로 풀었지만 설명 읽어보니 이게 플로이드–워셜 같음)
  • 방문처리를 위한 visited 배열 사용
  • Edge 클래스 구현
    • 끝 점 end
    • 가중치 w
  • 우선순위 큐 사용
    • Queue<Edge> queue = new PriorityQueue<>();
  • 결과를 기록할 배열 result[N+1][N+1] 구현
  • 큐가 빌 때까지 반복 !
    • 큐에서 꺼내서 Edge가 갈 수 있는 끝 점이 방문처리 되어 있으면 패스
    • 아니면 끝 점에서 시작하는 Edge 확인
    • result[start][e.end] = Math.min(value.w + e.w, result[start][e.end]);

코드

 

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

public class Main {
    public static int [][] result;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

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

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

        result = new int[N+1][N+1];

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

            edges[a].add(new Edge(b,w));
            result[a][b] = w;
        }

        for (int i = 1; i <= N; i++) {
            BFS(i, edges);
        }

        br.close();

        for (int i = 1; i <= N; i++) {
            for (int j = 1; j <= N; j++) {
                bw.write(result[i][j] + " ");
            }
            bw.newLine();
        }
        bw.flush();
        bw.close();
    }

    public static void BFS(int start, ArrayList<Edge> [] edges) {
        Queue<Edge> queue = new PriorityQueue<>();
        boolean[] visited = new boolean[edges.length];

        queue.add(new Edge(start, 0));

        while (!queue.isEmpty()) {
            Edge value = queue.poll();

            if(!visited[value.end]) {
                visited[value.end] = true;
                for (Edge e : edges[value.end]) {
                    if (!visited[e.end]) {
                        if(result[start][e.end] != 0)
                            result[start][e.end] = Math.min(value.w + e.w, result[start][e.end]);
                        if(result[start][e.end] == 0)
                            result[start][e.end] = value.w + e.w;

                        queue.add(new Edge(e.end, value.w + e.w));
                    }
                }
            }
        }
    }

    public static class Edge implements Comparable<Edge> {
        int end;
        int w;
        public Edge(int end, int w) {
            this.end = end;
            this.w = w;
        }

        @Override
        public int compareTo(Edge o) {
            if(w == o.w)
                return end - o.end;
            return w - o.w;
        }
    }
}

 

 

반응형

'CodingTEST' 카테고리의 다른 글

[프로그래머스] 다리를 지나는 트럭 (JAVA)  (0) 2024.02.18
[백준 1238] 파티(JAVA)  (1) 2024.02.11
[백준 9663] N-Queen(JAVA)  (1) 2024.02.11
[백준 1967] 트리의 지름(JAVA)  (1) 2024.02.11
[백준 1753] 최단경로(JAVA)  (1) 2024.02.11