มีกราฟไม่มีทิศทาง น้ำหนัก n โหนด edgeList[i]=(u,v,w) และคิวรี (p,q,lim) ถามว่ามีเส้นทางจาก p ไป q ระยะทาง < lim หรือไม่ คืน True/False แต่ละคิวรี
ตัวอย่าง: ผลลัพธ์ [True, False, True]
วิธีแก้ปัญหา (Union-Find + Offline)
- เรียง
edgeListตามน้ำหนัก - เรียงคิวรีตาม
lim - Union-Find เพิ่ม edge ทีละเส้นจนน้ำหนัก < limit ของคิวรีนั้น
- ตรวจสอบว่า
p,qอยู่ใน component เดียวกันหรือไม่
ตัวอย่างโค้ด
def solve(n, edgeList, queries):
parent = [i for i in range(n+1)]
rank = [0]*(n+1)
def find(parent, x):
if parent[x] == x: return x
parent[x] = find(parent, parent[x])
return parent[x]
def union(parent, a, b):
a = find(parent, a); b = find(parent, b)
if a == b: return
if rank[a] < rank[b]: parent[a] = b
elif rank[a] > rank[b]: parent[b] = a
else: parent[b] = a; rank[a] += 1
edgeList.sort(key=lambda x: x[2])
res = [0]*len(queries)
queries = [[i, ch] for i, ch in enumerate(queries)]
queries.sort(key=lambda x: x[1][2])
ind = 0
for i, (a, b, w) in queries:
while ind < len(edgeList) and edgeList[ind][2] < w:
union(parent, edgeList[ind][0], edgeList[ind][1])
ind += 1
res[i] = find(parent, a) == find(parent, b)
return res
n = 4
edgeList = [(1,2,16),(1,3,8),(2,4,3),(2,3,6),(4,3,3)]
queries = [(1,4,12),(2,3,3),(1,2,15)]
print(solve(n, edgeList, queries))
อินพุต
4, [(1,2,16),(1,3,8),(2,4,3),(2,3,6),(4,3,3)], [(1,4,12),(2,3,3),(1,2,15)]
เอาต์พุต
[True, False, True]