hackerrank: превышен лимит времени на вопросы, связанные с алгоритмом Дейкстры - PullRequest
0 голосов
/ 06 мая 2020
• 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]);
    }



}
...