class Solution:
def closestMeetingNode(self, edges: list[int], node1: int, node2: int) -> int:
adj = defaultdict(list)
for i, nei in enumerate(edges):
adj[i].append(nei)
def bfs(src, distMap):
q = deque([(src, 0)])
distMap[src] = 0
while q:
node, dist = q.popleft()
for nei in adj[node]:
if nei not in distMap:
q.append((nei, dist + 1))
distMap[nei] = dist + 1
node1Dist, node2Dist = {}, {}
bfs(node1, node1Dist)
bfs(node2, node2Dist)
res, resDist = -1, float("inf")
for i in range(len(edges)):
if i in node1Dist and i in node2Dist:
dist = max(node1Dist[i], node2Dist[i])
if dist < resDist:
resDist, res = dist, i
return resclass Solution:
def closestMeetingNode(self, edges: list[int], node1: int, node2: int) -> int:
n = len(edges)
def bfs(src):
dist = [-1] * n
q = deque([src])
dist[src] = 0
while q:
node = q.popleft()
nei = edges[node]
if nei == -1 or dist[nei] >= 0:
continue
q.append(nei)
dist[nei] = dist[node] + 1
return dist
node1Dist, node2Dist = bfs(node1), bfs(node2)
res, resDist = -1, float("inf")
for i in range(n):
if node1Dist[i] != -1 and node2Dist[i] != -1:
dist = max(node1Dist[i], node2Dist[i])
if dist < resDist:
resDist, res = dist, i
return resclass Solution:
def closestMeetingNode(self, edges: List[int], node1: int, node2: int) -> int:
n = len(edges)
def dfs(node, dist):
nei = edges[node]
if nei != -1 and dist[nei] == -1:
dist[nei] = dist[node] + 1
dfs(nei, dist)
node1Dist = [-1] * n
node2Dist = [-1] * n
node1Dist[node1] = node2Dist[node2] = 0
dfs(node1, node1Dist)
dfs(node2, node2Dist)
res, resDist = -1, float("inf")
for i in range(n):
if min(node1Dist[i], node2Dist[i]) != -1:
dist = max(node1Dist[i], node2Dist[i])
if dist < resDist:
resDist, res = dist, i
return resclass Solution:
def closestMeetingNode(self, edges: list[int], node1: int, node2: int) -> int:
n = len(edges)
def dfs(node):
dist = [-1] * n
dist[node] = 0
while edges[node] != -1 and dist[edges[node]] == -1:
nei = edges[node]
dist[nei] = dist[node] + 1
node = nei
return dist
node1Dist, node2Dist = dfs(node1), dfs(node2)
res, resDist = -1, float("inf")
for i in range(n):
if min(node1Dist[i], node2Dist[i]) != -1:
dist = max(node1Dist[i], node2Dist[i])
if dist < resDist:
resDist, res = dist, i
return res