백준 1916 최소비용 구하기 JAVA

sundays·2023년 1월 7일
0

문제

최소비용 구하기

풀이

다익스트라 문제이다. BFS와 헷갈리지만 다른 점은 있다. BFS는 모든 간선의 가중치가 같지만 다익스트라는 다르다는 점이다.

  1. 시작점에서 출발했을때 각지점에 도달할 가장 짧은 비용을 담을 배열을 선언한다
		int[] costs = new int[n + 1];
        Arrays.fill(costs, Integer.MAX_VALUE);

배열은 1부터 시작하기 때문에 n+1까지 생성하고 배열 안에 가장 큰 수를 입력한다.

  1. 다익스트라는 가장 최소비용으로 큐를 add하기 위해서는 PriorityQueue를 사용한다. 이렇게 하기 위해서는 Compareable또는 Comparator를 사용하면 된다
	static class City implements Comparable<City> {
        int next;
        int cost;

        City(int next, int cost) {
            this.next = next;
            this.cost = cost;
        }

        @Override
        public int compareTo(City o) {
            return this.cost - o.cost;
        }
    }
  1. BFS처럼 코드를 생성하는데, 큐로 입력하는 순간 방문 처리하는 것이 아니라 큐로 갈수 있는 정보들을 전부 넣고 난 다음 정렬된 PriorityQueue의 성질을 사용하여 가장 짧은 부분 먼저 접근한다.
		PriorityQueue<City> q = new PriorityQueue<>();
        q.add(new City(start, 0));
        costs[start] = 0;
        while (!q.isEmpty()) {
            City city = q.poll();
            if (!visit[city.next]) {
                visit[city.next] = true;
                for (City c : arr[city.next]) {
                    if (!visit[c.next] && costs[city.next] + c.cost < costs[c.next]) {
                        costs[c.next] = costs[city.next] + c.cost;
                        q.add(new City(c.next, costs[c.next]));
                    }
                }
            }
        }

전체 코드

전체 코드

profile
develop life

0개의 댓글