## Similar Problems

Similar Problems not available

# Count Ways To Build Rooms In An Ant Colony - Leetcode Solution

## Companies:

LeetCode: Count Ways To Build Rooms In An Ant Colony Leetcode Solution

Difficulty: Hard

Topics: math dynamic-programming tree graph

Problem Statement:

You are given an integer n, the number of rooms in an ant colony. Each room has a distinct index between 0 and n-1. You are also given an array antenae of length n, where antenae[i] is the index of the room to which room i is connected by a one-way antenae.

To build a new room, you must choose a room with at least one antenae and connect the new room to it by a one-way antenae. You can build any number of rooms.

Return the number of ways to build new rooms in the ant colony. Since the answer may be very large, return it modulo 109 + 7.

Approach:

This is a graph-based problem, and we need to find out the number of ways we can build rooms in an ant colony. We can use dynamic programming to solve this problem. We can define dp[i] as the number of ways to build rooms using i as the root node of the subtree. We can calculate the value of dp[i] by recursively calculating the value of dp[j] for all the children j of i.

Let's say j is a child of i, then the number of ways to build rooms using i as the root node will be the product of the number of ways to build rooms for all the children of j plus 1. Here, we need to add one because we can also choose to build a new room on i. The final answer will be the sum of all values of dp[i] for all i in the graph.

Algorithm:

- Define a function to calculate the number of ways to build rooms using a given node as the root. The function will take the node number i and the adjacency list of the graph adj as inputs.
- Initialize dp[i] to 1 as the minimum number of ways to build a room is 1.
- For all children j of i, calculate the number of ways to build rooms using j as the root node and multiply it with dp[j]+1.
- Add the product obtained in step 3 to dp[i].
- Return dp[i] after calculating values for all children of i.
- The final answer will be the sum of all values of dp[i] for all i in the graph.
- Return the final answer modulo 10^9+7.

Code:

Here's the Python implementation of the above approach:

```
class Solution:
def waysToBuildRooms(self, antenae: List[int]) -> int:
MOD = int(1e9 + 7)
n = len(antenae)
adj = [[] for _ in range(n)]
for i in range(1, n):
adj[antenae[i]].append(i)
def dfs(i):
dp[i] = 1
for j in adj[i]:
dfs(j)
dp[i] = (dp[i] * (dp[j] + 1)) % MOD
ans = 0
for i in range(n):
dp = [0] * n
dfs(i)
ans = (ans + dp[i]) % MOD
return ans
```

Time Complexity: The time complexity of the algorithm depends on the number of nodes in the graph. We are visiting each node exactly once, and for each node, we are visiting all its children. So, the time complexity of the algorithm will be O(n^2), where n is the number of nodes in the graph.

Space Complexity: The space complexity of the algorithm is O(n), where n is the number of nodes in the graph. We are using an adjacency list to represent the graph, and we are storing the dp values for each node. So, the space complexity is linear in the number of nodes.

## Count Ways To Build Rooms In An Ant Colony Solution Code

`1`