Skip to main content

Command Palette

Search for a command to run...

Solving Leetcode Interviews in Seconds with AI: Count Pairs of Connectable Servers in a Weighted Tree Network

Updated
4 min read

Introduction

In this blog post, we will explore how to solve the LeetCode problem "3067" using AI. LeetCode is a popular platform for preparing for coding interviews, and with the help of AI tools like Chatmagic, we can generate solutions quickly and efficiently - helping you pass the interviews and get the job offer without having to study for months.

Problem Statement

You are given an unrooted weighted tree with n vertices representing servers numbered from 0 to n - 1, an array edges where edges[i] = [ai, bi, weighti] represents a bidirectional edge between vertices ai and bi of weight weighti. You are also given an integer signalSpeed. Two servers a and b are connectable through a server c if: a < b, a != c and b != c. The distance from c to a is divisible by signalSpeed. The distance from c to b is divisible by signalSpeed. The path from c to b and the path from c to a do not share any edges. Return an integer array count of length n where count[i] is the number of server pairs that are connectable through the server i. Example 1: Input: edges = [[0,1,1],[1,2,5],[2,3,13],[3,4,9],[4,5,2]], signalSpeed = 1 Output: [0,4,6,6,4,0] Explanation: Since signalSpeed is 1, count[c] is equal to the number of pairs of paths that start at c and do not share any edges. In the case of the given path graph, count[c] is equal to the number of servers to the left of c multiplied by the servers to the right of c. Example 2: Input: edges = [[0,6,3],[6,5,3],[0,3,1],[3,2,7],[3,1,6],[3,4,2]], signalSpeed = 3 Output: [2,0,0,0,0,0,2] Explanation: Through server 0, there are 2 pairs of connectable servers: (4, 5) and (4, 6). Through server 6, there are 2 pairs of connectable servers: (4, 5) and (0, 5). It can be shown that no two servers are connectable through servers other than 0 and 6. Constraints: 2 <= n <= 1000 edges.length == n - 1 edges[i].length == 3 0 <= ai, bi < n edges[i] = [ai, bi, weighti] 1 <= weighti <= 106 1 <= signalSpeed <= 106 The input is generated such that edges represents a valid tree.

Explanation

Here's the breakdown of the solution and the code:

  • High-Level Approach:

    • Build an adjacency list representation of the tree from the given edges.
    • For each server c, perform a Depth-First Search (DFS) to find all servers a and b that satisfy the connectivity conditions (a < b, a != c, b != c, distances divisible by signalSpeed, and no shared edges between paths c-a and c-b).
    • Increment count[c] for each valid server pair (a, b) found.
  • Complexity:

    • Runtime Complexity: O(n^3) - dominated by the nested loops within the DFS for each server.
    • Storage Complexity: O(n^2) - primarily for the adjacency list and the visited sets during DFS.

Code

    def count_connectable_servers(edges, signalSpeed):
    n = len(edges) + 1
    adj = [[] for _ in range(n)]
    for u, v, w in edges:
        adj[u].append((v, w))
        adj[v].append((u, w))

    count = [0] * n

    def dfs(start, target, c, signalSpeed):
        """
        Performs a DFS to find the distance between 'start' and 'target' and the path taken.
        Returns (distance, path) if target is reachable, otherwise (float('inf'), [])
        """
        visited = set()
        stack = [(start, 0, [])]  # (node, distance, path)

        while stack:
            node, dist, path = stack.pop()
            if node == target:
                return dist, path

            visited.add(node)

            for neighbor, weight in adj[node]:
                if neighbor not in visited:
                    stack.append((neighbor, dist + weight, path + [(node, neighbor)]))

        return float('inf'), []

    def paths_share_edges(path1, path2):
        """Checks if two paths share any edges."""
        edges1 = set(path1)
        edges2 = set(path2)
        return not edges1.isdisjoint(edges2)

    for c in range(n):
        for a in range(n):
            for b in range(a + 1, n):
                if a != c and b != c:
                    dist_ca, path_ca = dfs(c, a, c, signalSpeed)
                    dist_cb, path_cb = dfs(c, b, c, signalSpeed)

                    if dist_ca != float('inf') and dist_cb != float('inf'):
                        if dist_ca % signalSpeed == 0 and dist_cb % signalSpeed == 0:
                            if not paths_share_edges(path_ca, path_cb):
                                count[c] += 1

    return count

More from this blog

C

Chatmagic blog

2894 posts