Hard
,Array
,Graph
1697. Checking Existence of Edge Length Limited Paths
An undirected graph of n
nodes is defined by edgeList
, where edgeList[i]
= [
Given an array queries, where queries[j]
= [
Return a boolean array answer
, where answer.length == queries.length
and the jth value of answer
is true
if there is a path for queries[j]
is true
, and false
otherwise.
Example 1:
Input: n = 3, edgeList = [[0,1,2],[1,2,4],[2,0,8],[1,0,16]], queries = [[0,1,2],[0,2,5]]
Output: [false,true]
Explanation: The above figure shows the given graph. Note that there are two overlapping edges between 0 and 1 with distances 2 and 16.
For the first query, between 0 and 1 there is no path where each distance is less than 2, thus we return false for this query.
For the second query, there is a path (0 -> 1 -> 2) of two edges with distances less than 5, thus we return true for this query.
Example 2:
Input: n = 5, edgeList = [[0,1,10],[1,2,5],[2,3,9],[3,4,13]], queries = [[0,4,14],[1,4,13]]
Output: [true,false]
Exaplanation: The above figure shows the given graph.
Constraints:
n
<= 105edgeList.length
, queries.length
<= 105edgeList[i].length
== 3queries[j].length
== 3n
- 1
class Solution:
def distanceLimitedPathsExist(self, n: int, edgeList: List[List[int]], queries: List[List[int]]) -> List[bool]:
parents = list(range(n))
ranks = [0] * n
def find(x):
if parents[x] != x:
parents[x] = find(parents[x])
return parents[x]
def union(x, y):
x, y = find(x), find(y)
if x != y:
if ranks[x] < ranks[y]:
parents[x] = y
elif ranks[x] > ranks[y]:
parents[y] = x
else:
parents[y] = x
ranks[x] += 1
ans = [False] * len(queries)
edges = sorted(edgeList, key=lambda x: -x[2])
queries = sorted(enumerate(queries), key=lambda x: x[1][2])
for i, (p, q, limit) in queries:
while len(edges) > 0 and edges[-1][2] < limit:
u, v, _ = edges.pop()
union(u, v)
ans[i] = find(p) == find(q)
return ans
Yen-Chi ChenMon, May 1, 2023