Skip to content

Commit 371f571

Browse files
authored
Update closest-node-to-path-in-tree.py
1 parent 202fefc commit 371f571

File tree

1 file changed

+36
-1
lines changed

1 file changed

+36
-1
lines changed

Python/closest-node-to-path-in-tree.py

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ def divide(curr, parent):
205205
stk.pop()()
206206
self.D, self.P = D, P
207207

208-
def lca(self, a, b): # Time: O(H)
208+
def lca(self, a, b): # Time: O(logh)
209209
while self.D[a] > self.D[b]:
210210
a = self.P[a]
211211
while self.D[a] < self.D[b]:
@@ -229,3 +229,38 @@ def closestNode(self, n, edges, query):
229229
adj[u].append(v), adj[v].append(u)
230230
tree_infos = TreeInfos3(adj)
231231
return [max((tree_infos.lca(x, y) for x, y in ((start, end), (start, node), (end, node))), key=lambda x: tree_infos.D[x]) for start, end, node in query]
232+
233+
234+
# Time: O(n^2 + q * n)
235+
# Space: O(n^2)
236+
# bfs
237+
class Solution4(object):
238+
def closestNode(self, n, edges, query):
239+
"""
240+
:type n: int
241+
:type edges: List[List[int]]
242+
:type query: List[List[int]]
243+
:rtype: List[int]
244+
"""
245+
def bfs(adj, root):
246+
dist = [len(adj)]*len(adj)
247+
q = [root]
248+
dist[root] = 0
249+
d = 0
250+
while q:
251+
new_q = []
252+
for u in q:
253+
for v in adj[u]:
254+
if d+1 >= dist[v]:
255+
continue
256+
dist[v] = d+1
257+
new_q.append(v)
258+
q = new_q
259+
d += 1
260+
return dist
261+
262+
adj = [[] for _ in xrange(n)]
263+
for u, v in edges:
264+
adj[u].append(v), adj[v].append(u)
265+
dist = [bfs(adj, i) for i in xrange(n)]
266+
return [max((i for i in xrange(n) if dist[start][node]+dist[node][end]-2*dist[node][i] == dist[start][i]+dist[i][end]), key=lambda x: dist[node][x]) for start, end, node in query]

0 commit comments

Comments
 (0)