1466. Reorder Routes to Make All Paths Lead to the City Zero
Description
There are n
cities numbered from 0
to n - 1
and n - 1
roads such that there is only one way to travel between two different cities (this network form a tree). Last year, The ministry of transport decided to orient the roads in one direction because they are too narrow.
Roads are represented by connections
where connections[i] = [ai, bi]
represents a road from city ai
to city bi
.
This year, there will be a big event in the capital (city 0
), and many people want to travel to this city.
Your task consists of reorienting some roads such that each city can visit the city 0
. Return the minimum number of edges changed.
It's guaranteed that each city can reach city 0
after reorder.
Example 1:
Input: n = 6, connections = [[0,1],[1,3],[2,3],[4,0],[4,5]] Output: 3 Explanation: Change the direction of edges show in red such that each node can reach the node 0 (capital).
Example 2:
Input: n = 5, connections = [[1,0],[1,2],[3,2],[3,4]] Output: 2 Explanation: Change the direction of edges show in red such that each node can reach the node 0 (capital).
Example 3:
Input: n = 3, connections = [[1,0],[2,0]] Output: 0
Constraints:
2 <= n <= 5 * 104
connections.length == n - 1
connections[i].length == 2
0 <= ai, bi <= n - 1
ai != bi
Solutions
Solution: Depth-First Search
- Time complexity: O(n)
- Space complexity: O(n)
JavaScript
/**
* @param {number} n
* @param {number[][]} connections
* @return {number}
*/
const minReorder = function (n, connections) {
const routesSet = new Set();
const connectionMap = connections.reduce((map, [from, to]) => {
const connectionFrom = map.get(from) ?? [];
const connectionTo = map.get(to) ?? [];
routesSet.add(`${from}_${to}`);
connectionFrom.push(to);
connectionTo.push(from);
map.set(from, connectionFrom);
return map.set(to, connectionTo);
}, new Map());
const getReorderCount = (route, parent) => {
const currentConnections = connectionMap.get(route);
return currentConnections.reduce((count, connection) => {
if (parent === connection) return count;
const isReorder = routesSet.has(`${route}_${connection}`);
return count + getReorderCount(connection, route) + (isReorder ? 1 : 0);
}, 0);
};
return getReorderCount(0, -1);
};