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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
| package org.stone.study.algo.ex202411;
import java.util.*;
public class ShortestPaths { public static void main(String[] args) { int n = 5; int[][] queries = {{2, 4}, {0, 2}, {0, 4}};
int[] ans = new ShortestPaths().shortestDistanceAfterQueries2(n, queries); System.out.println(Arrays.toString(ans)); } public int[] shortestDistanceAfterQueries(int n, int[][] queries) { List<Integer>[] neighbors = new ArrayList[n]; for(int i = 0; i < n - 1; i++) { neighbors[i] = new ArrayList<>(); neighbors[i].add(i + 1); } neighbors[n-1] = new ArrayList<>();
int m = queries.length; int[] ans = new int[m]; for(int i = 0; i < m; i++) { int[] query = queries[i]; neighbors[query[0]].add(query[1]); ans[i] = bfs(neighbors); }
return ans; }
private int bfs(List<Integer>[] neighbors) { int n = neighbors.length; int[] dist = new int[n]; Arrays.fill(dist, -1);
Queue<Integer> queue = new LinkedList<>(); queue.offer(0); dist[0] = 0; while(!queue.isEmpty()) { int cur = queue.poll(); for(int neighbor : neighbors[cur]) { if (dist[neighbor] < 0) { queue.offer(neighbor); dist[neighbor] = dist[cur] + 1; } } }
return dist[n - 1]; }
public int[] shortestDistanceAfterQueries2(int n, int[][] queries) { int[] ans = new int[queries.length]; int[] dp = new int[n]; ArrayList<Integer>[] preNodes = new ArrayList[n]; for (int i = 1; i < n; i++) { dp[i] = i; preNodes[i] = new ArrayList<Integer>(); preNodes[i].add(i-1); }
for (int i = 0; i < queries.length; i++) { int u = queries[i][0], v = queries[i][1]; preNodes[v].add(u); for(int j = v; j < n; j++) { for(int pre : preNodes[j]) { if (dp[pre] + 1 < dp[j]) { dp[j] = dp[pre] + 1; } } } ans[i] = dp[n-1]; }
return ans; } }
|