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] * ndef setFind(st, x):if st[x] < 0:return xst[x] = setFind(st, st[x])return st[x]def setUnion(st, x, y):rx = setFind(st, x)ry = setFind(st, y)if rx == ry:returnif st[rx] < st[ry]:st[rx] += st[ry]st[ry] = rxelse:st[ry] += st[rx]st[rx] = ryei = 0res = [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 += 1res[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也是适用的,所以不断累积就可以了
妙!
