call(back)
Algorithms & Data Structuresmedium

Roads with Switches

A city map is a directed graph. Every one-way road (u, v) has a switch and is currently OPEN (drivable) or CLOSED. You may flip closed roads open, each flip spending one of your allowed flips; open roads cost nothing.

minFlips(roads, src, dst) -> minimum flips to drive src -> dst,
                             or -1 if unreachable even with unlimited flips
canReach(roads, src, dst, k) -> minFlips is in [0, k]
roads = [["A","B",true], ["B","C",false], ["A","D",false], ["D","C",false]]
minFlips(roads, "A", "C") => 1        (A->B open, flip B->C)
canReach(roads, "A", "C", 0) => false
canReach(roads, "A", "C", 1) => true
minFlips(roads, "C", "A") => -1       (roads are one-way)
minFlips(roads, "A", "A") => 0

Up to 10^5 nodes and 10^6 roads; node ids are arbitrary; src or dst may appear on no road at all (then only src == dst is reachable). Expected O(V + E).

Follow-up (the grid variant, LC 1293)

An m × n grid of 0s and 1s; you may walk through at most k obstacles. Minimum steps corner to corner — every step costs 1, so plain BFS over (r, c, obstaclesUsed) states; and when k >= m + n − 3 the answer is just the Manhattan distance.

Asked at