알고리즘/graph

[leetcode] 787 cheapest flight within stops (벨만포드)

씩씩한 IT블로그 2024. 5. 3. 12:32
반응형

문제설명

최대로 거칠 수 있는 노드의 수가 제한되어 상태에서 출발지부터 목적자까지 최단거리를 구한다. 

예를 들어  아래와 같은 그래프에서 

노드0에서 노드3까지 최대 1노드만 거쳐서 갈 수 있는 최단거리는 0->1->3 의 경로로 가는 700이 정답이다.

(0->1->2->3 으로 가면 400으로 더 적지만, 이는 두개의 노드를 거쳐야 한다)

 

문제풀이

밸만포드를 이용한다.

벨만포드는 음의 가중치가 있는 그래프에서 최단거리를 구할 수 있는 알고리즘인데, 다음과 같은 특징으로 이 문제에서 사용할 수 있다.

1. 노드 수 만큼 반복을 진행할 떄,  k번째 반복에서 k번째로 가까운 노드의 최단거리가 찾아짐이 보장된다.

2. k보다 더 멀리있는 노드에 대해서는 k개의 노드를 거쳐서 갈 수 있는 최단거리가 찾아짐이 보장된다.

3. 만약 k번으로 도달할 수 없는 노드가 있다면, 해당 노드까지의 거리는 무한대에서 변화되지 않는다.

 

다만 2,3을 만족시키기 위해서는 temp리스트를 사용해아 한다.

왜냐하면 노드수만큼 반복을 할 때 temp리스트를 사용하지않고 그 즉시 최단거리를 업데이트하면, k보다 더 멀리있는 노드가 k번 이하 반복에서 최단거리로 업데이트 될 수 있기 때문이다.

 

코드

class Solution {
        public int findCheapestPrice(int n, int[][] flights, int src, int dst, int k) {
            int[] distArray = new int[n];
            int INF = Integer.MAX_VALUE;
            Arrays.fill(distArray, INF);
            distArray[src]=0;

            int edgeSize = flights.length;

            for (int i=1; i<=k+1; i++) {
                int[] temp = Arrays.copyOf(distArray,n);
                for (int j=0; j<edgeSize; j++) {
                    int u = flights[j][0];
                    int v = flights[j][1];
                    int cost = flights[j][2];

                    if (distArray[u]!=INF && (distArray[u]+cost < temp[v])) {
                        temp[v] = distArray[u]+cost;
                    }
                }
                distArray = temp;

//                System.out.println(Arrays.toString(distArray));
            }

            if (distArray[dst]==INF) {
                return -1;
            } else{
                return distArray[dst];
            }
        }
    }
반응형