a_lc_檢查邊長度限制的路徑是否存在(並查集離線處理)
阿新 • • 發佈:2020-12-20
給一個數組queries,queries[j]=[p, q, limit],你的任務是對於每個查詢,判斷是否存在從p到q的路徑,且這條路徑上的每一條邊都 嚴格小於limit。
2 <= n <= 105
1 <= edgeList.length, queries.length <= 105
思路:問的是兩個結點帶限制下的連通性;對於每個查詢qs[i],可以把邊集es中邊長小於qs[i].limit的邊全都加到並查集中,如果給定的邊集一直滿足就一直加,然再判端qs[i]的兩個點的連通性即可
class UF: def __init__(self, n) -> None: self.fa=[i for i in range(n)] def find(self, u): if u==self.fa[u]: return u self.fa[u]=self.find(self.fa[u]) return self.fa[u] def union(self, u, v): fu,fv=self.find(u),self.find(v) self.fa[fu]=fv class Solution: def distanceLimitedPathsExist(self, n: int, es: List[List[int]], qs: List[List[int]]) -> List[bool]: m,lenQ=len(es),len(qs) qs=[[u,v,w,idx] for idx,[u,v,w] in enumerate(qs)] uf=UF(n) qs.sort(key=lambda q:q[2]) es.sort(key=lambda e:e[2]) j,ans=0,[0]*lenQ for i in range(lenQ): while j<m and es[j][2]<qs[i][2]: uf.union(es[j][0], es[j][1]) j+=1 ans[qs[i][3]]=uf.find(qs[i][0])==uf.find(qs[i][1]) return ans
ps:剛剛還在想怎麼線上演算法切掉這題,所以一直拖著沒發(這題也是需要換個思維去做的)