Bitmask DP

// dp[mask][v] = shortest path visiting waypoints in mask, ending at v
for (int mask = 0; mask < (1 << K); mask++)
  for (int i = 0; i < K; i++) {
    if ((mask & (1 << i)) == 0) continue;
    for (int j = 0; j < K; j++) {
      if (i == j || (mask & (1 << j)) == 0) continue;
      dp[mask][i] = min(dp[mask][i], dp[mask ^ (1<
Advertisement

Preprocessing

Compute all-pairs distances among {src, waypoints, tgt}. Dijkstra × (K+2). Not full graph.

Advertisement

Complexity

Preprocessing: O((K+2) × (V+E) log V). DP: O(2^K × K²). Feasible for K ≤ 20.

Ordered waypoints

Must visit in given order: linear DP. O(K × (V+E)).