Problem
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 * 10^4
connections.length == n - 1
connections[i].length == 2
0 <= ai, bi <= n - 1
ai != bi
Solution (Java)
class Solution {
public int minReorder(int n, int[][] connections) {
Queue<Integer> q = new LinkedList<>();
boolean[] vis = new boolean[n];
List<List<Integer>> adj = new ArrayList<>();
int count = 0;
for (int i = 0; i < n; i++) {
adj.add(new ArrayList<>());
}
for (int[] tup : connections) {
adj.get(tup[0]).add(tup[1]);
adj.get(tup[1]).add(-tup[0]);
}
q.offer(0);
vis[0] = true;
while (!q.isEmpty()) {
int node = q.poll();
for (int it : adj.get(node)) {
if (!vis[Math.abs(it)]) {
vis[Math.abs(it)] = true;
if (it > 0) {
count++;
}
q.offer(Math.abs(it));
}
}
}
return count;
}
}
Explain:
nope.
Complexity:
- Time complexity : O(n).
- Space complexity : O(n).