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 32 33 34 35 36 37 38 39 40
| class Solution { public int minimumCost(int[] start, int[] target, int[][] specialRoads) { return dijkstra(start, target, specialRoads); }
private int dijkstra(int[] start, int[] target, int[][] specialRoads) { Map<Long, Integer> dist = new HashMap<>(); long targetLong = (long) target[0] << 32 | target[1], startLong = (long) start[0] << 32 | start[1]; dist.put(targetLong, Integer.MAX_VALUE); for (int i = 0; i < specialRoads.length; ++i) dist.put((long) specialRoads[i][2] << 32 | specialRoads[i][3], Integer.MAX_VALUE); dist.put(startLong, 0); Set<Long> visited = new HashSet<>(); while (true) { int minDist = Integer.MAX_VALUE; long minIndex = -1; for (Long key : dist.keySet()) { if (!visited.contains(key) && dist.get(key) < minDist) { minDist = dist.get(key); minIndex = key; } } if (minIndex == targetLong) return minDist; visited.add(minIndex); int vx = (int) (minIndex >> 32), vy = (int) minIndex & Integer.MAX_VALUE; dist.merge(targetLong, minDist + Math.abs(target[0] - vx) + Math.abs(target[1] - vy), Math::min); for (int[] sr : specialRoads) { long node = (long) sr[2] << 32 | sr[3]; int manhattanDist = minDist + Math.min(Math.abs(vx - sr[0]) + Math.abs(vy - sr[1]) + sr[4], Math.abs(vx - sr[2]) + Math.abs(vy - sr[3])); if (manhattanDist < dist.get(node)) dist.put(node, manhattanDist); } } } }
|