Count Subtrees With Max Distance Between Cities LeetCode solution in Python
1# Runtime: 2577 ms (Top 35.48%) | Memory: 14.1 MB (Top 20.97%)2from collections import defaultdict345class Solution:6def countSubgraphsForEachDiameter(7self, n: int, edges: List[List[int]]8) -> List[int]:9def floydwarshall(n, edges):10D = [[float("inf")] * n for _ in range(n)]11for u, v in edges:12D[u - 1][v - 1] = 113D[v - 1][u - 1] = 114for v in range(n):15D[v][v] = 016for k in range(n):17for i in range(n):18for j in range(n):19D[i][j] = min(D[i][j], D[i][k] + D[k][j])20return D2122G = defaultdict(list)23for v, w in edges:24G[v - 1].append(w - 1)25G[w - 1].append(v - 1)2627def dfs(G, v, V, visited):28if v in visited:29return30visited.add(v)31for w in G[v]:32if w in V:33dfs(G, w, V, visited)3435def check_connected(G, V):36if not V:37return False38root = next(iter(V))39visited = set()40dfs(G, root, V, visited)41return visited == V4243def max_distance(D, V):44res = 045for v in V:46for w in V:47res = max(res, D[v][w])48return res4950def solve(include, idx, ans, G, D):51if idx == n:52V = set(v for v in range(n) if include[v])53if check_connected(G, V):54d = max_distance(D, V)55if d >= 1:56ans[d - 1] += 157else:58solve(include, idx + 1, ans, G, D)59include[idx] = True60solve(include, idx + 1, ans, G, D)61include[idx] = False6263D = floydwarshall(n, edges)64include = [False] * n65ans = [0] * (n - 1)66solve(include, 0, ans, G, D)67return ans