• 1000 Я использовал Dijkstra для решения обеих задач и прошел большинство тестовых примеров, а в 1 или 2 случаях было указано превышение лимита времени. Я вставляю сюда свой код и надеюсь, что кто-нибудь сможет предложить несколько предложений. Спасибо.
код для Дейкстры: Кратчайший радиус действия 2
static class Pair {
int p;
int dis;
public Pair(int p, int dis) {
this.p = p;
this.dis = dis;
}
}
// Complete the shortestReach function below.
static int[] shortestReach(int n, int[][] edges, int s) {
Map < Integer, List < Pair >> map = new HashMap < > ();
for (int[] edge: edges) {
map.computeIfAbsent(edge[0], k - > new ArrayList < > ()).add(new Pair(edge[1], edge[2]));
map.computeIfAbsent(edge[1], k - > new ArrayList < > ()).add(new Pair(edge[0], edge[2]));
}
int[] dist = new int[n + 1];
Arrays.fill(dist, Integer.MAX_VALUE);
dist[s] = 0;
boolean[] visited = new boolean[n + 1];
PriorityQueue < Integer > pq = new PriorityQueue < > ((a, b) - > (dist[a] - dist[b]));
pq.add(s);
while (!pq.isEmpty()) {
int cur = pq.poll();
if (visited[cur]) continue;
visited[cur] = true;
if (map.containsKey(cur)) {
for (Pair neighbor: map.get(cur)) {
//if(visited[neighbor.p]) continue;
if (dist[cur] + neighbor.dis < dist[neighbor.p]) {
dist[neighbor.p] = dist[cur] + neighbor.dis;
if (!visited[neighbor.p] && pq.contains(neighbor.p)) {
pq.remove(neighbor.p);
pq.add(neighbor.p);
} else if (!visited[neighbor.p]) {
pq.add(neighbor.p);
}
}
}
}
}
int[] res = new int[n - 1];
int p = 0;
for (int i = 1; i <= n; i++) {
if (i == s) continue;
res[p++] = dist[i] == Integer.MAX_VALUE ? -1 : dist[i];
}
return res;
}
код для Джека переходит в Восторг
static class Edge {
int next;
int dis;
public Edge(int next, int dis) {
this.next = next;
this.dis = dis;
}
}
public static void getCost(int gNodes, int gEdges, List < Integer > gFrom, List < Integer > gTo, List < Integer > gWeight) {
Map < Integer, List < Edge >> routes = new HashMap < > ();
for (int i = 0; i < gEdges; i++) {
routes.computeIfAbsent(gFrom.get(i), k - > new ArrayList < > ()).add(new Edge(gTo.get(i), gWeight.get(i)));
routes.computeIfAbsent(gTo.get(i), k - > new ArrayList < > ()).add(new Edge(gFrom.get(i), gWeight.get(i)));
}
int[] dist = new int[gNodes + 1];
boolean[] visited = new boolean[gNodes + 1];
Arrays.fill(dist, Integer.MAX_VALUE);
dist[1] = 0;
PriorityQueue < Integer > pq = new PriorityQueue < > ((a, b) - > (dist[a] - dist[b]));
pq.add(1);
while (!pq.isEmpty()) {
int cur = pq.poll();
if (visited[cur]) continue;
visited[cur] = true;
if (routes.containsKey(cur)) {
for (Edge e: routes.get(cur)) {
if (Math.max(dist[cur], e.dis) < dist[e.next]) {
dist[e.next] = Math.max(dist[cur], e.dis);
if (!visited[e.next] && pq.contains(e.next)) {
pq.remove(e.next);
pq.add(e.next);
} else if (!visited[e.next]) {
pq.add(e.next);
}
}
}
}
}
if (dist[gNodes] == Integer.MAX_VALUE) {
System.out.println("NO PATH EXISTS");
} else {
System.out.println(dist[gNodes]);
}
}