https://leetcode.com/problems/checking-existence-of-edge-length-limited-paths/
谁能想到是并查集呀!
想不到想不到,记录下来!
个人解答
class Solution:
def distanceLimitedPathsExist(self, n: int, es: List[List[int]], qs: List[List[int]]) -> List[bool]:
qs = sorted([[p, q, l, i] for i, (p, q, l) in enumerate(qs)], key=lambda x:x[2])
es.sort(key=lambda x:x[2])
st = [-1] * n
def setFind(st, x):
if st[x] < 0:
return x
st[x] = setFind(st, st[x])
return st[x]
def setUnion(st, x, y):
rx = setFind(st, x)
ry = setFind(st, y)
if rx == ry:
return
if st[rx] < st[ry]:
st[rx] += st[ry]
st[ry] = rx
else:
st[ry] += st[rx]
st[rx] = ry
ei = 0
res = [False] * len(qs)
for p, q, l, i in qs:
while ei < len(es) and es[ei][2] < l:
u, v, _ = es[ei]
setUnion(st, u, v)
ei += 1
res[i] = setFind(st, p) == setFind(st, q)
return res
题目分析
一眼看过去,是关于图的问题,求all-pair shortest path的问题。可是,限制条件可是10^5,来一个N^2的算法估计都超时了。
这道题,由于queries是事先给的,而最终,也只是要这些queries对应的结果。
对queries按照limit排序,那么后边的大的limit的query,或许可以利用前边的状态。
对于一个limit,计算出在该limit下,所有点能相互连接的状态。由于边也是可以sort的,所以这个也只用扫一遍就可以确定。
而能够记录点的相互连接状态,就是经典的并查集的应用了。
将queries和edges对limit/length进行sort之后
对于每一个query,将小于当前limit的点都join起来,判断能否连接直接判断是不是在一个set中即可
set的关系,对于更大的limit也是适用的,所以不断累积就可以了
妙!