DDSA Solutions

Number of Ways to Arrive at Destination

Time: O((V+E)logV)
Space: O(V+E)

Problem Overview

Dijkstra with count tracking.

See our study guide for structured GFG and LeetCode practice.

Intuition

Dijkstra with count tracking. Along with shortest distance, track number of ways to reach each node with that distance.

Algorithm

  1. 1Dijkstra: dist[], ways[] arrays. ways[0]=1, dist[0]=0.
  2. 2When relaxing edge: if new dist < dist[v]: update dist[v], ways[v]=ways[u].
  3. 3If new dist == dist[v]: ways[v] += ways[u].
  4. 4Return ways[n-1] % MOD.

Common Pitfalls

  • Count updates only when relaxation succeeds or equals current best. MOD required since count can be large.
Number of Ways to Arrive at Destination.java
Java
// Approach: Run Dijkstra's algorithm tracking both shortest distances and count of shortest paths.
// When a shorter path is found, update dist and reset ways to the source node's count.
// When an equal-length path is found, accumulate source's ways into the destination (mod 1e9+7).
// Time: O((V+E)logV) Space: O(V+E)
import java.util.*;

class Solution {

    public int countPaths(int V, int[][] edges) {
        final long MOD = (long) 1e9 + 7;
        List<List<int[]>> adj = new ArrayList<>();
        for (int i = 0; i < V; i++) {
            adj.add(new ArrayList<>());
        }

        for (int[] e : edges) {
            int u = e[0], v = e[1], w = e[2];
            adj.get(u).add(new int[]{v, w});
            adj.get(v).add(new int[]{u, w});
        }
        long[] dist = new long[V];
        long[] ways = new long[V];
        Arrays.fill(dist, Long.MAX_VALUE);
        PriorityQueue<long[]> pq = new PriorityQueue<>((a, b) -> Long.compare(a[0], b[0]));
        dist[0] = 0;
        ways[0] = 1;
        pq.add(new long[]{0, 0});
        while (!pq.isEmpty()) {
            long[] top = pq.poll();
            long d = top[0];
            int u = (int) top[1];

            if (d > dist[u]) {
                continue;
            }

            for (int[] nxt : adj.get(u)) {
                int v = nxt[0];
                long w = nxt[1];
                if (dist[v] > dist[u] + w) {
                    dist[v] = dist[u] + w;
                    ways[v] = ways[u];
                    pq.add(new long[]{dist[v], v});
                } else if (dist[v] == dist[u] + w) {
                    ways[v] = (ways[v] + ways[u]) % MOD;
                }
            }
        }

        return (int) (ways[V - 1] % MOD);
    }
}
Was this solution helpful?