前往
大廳
主題

LeetCode - 1697. Checking Existence of Edge Length Limited Paths 解題心得

Not In My Back Yard | 2024-03-06 12:00:11 | 巴幣 0 | 人氣 51

題目連結:


題目意譯:
有一個包含 n 個節點的無向圖是以 edgeList 定義,其中 edgeList[i] = [ui, vi, disi] 代表著節點 ui 到節點 vi 之間有一條邊且距離為 disi。注意到兩個節點之間可以有多條邊存在。

給定一個陣列 queries,其中 queries[j] = [pj, qj, limitj],你的任務是對每一筆詢問 queries[j] 判斷出 pj 到 qj 之間是否存在著一條路徑使得路徑上每一條邊的距離都嚴格小於 limitj。

回傳一個布林陣列 answer,其中 answer.length == queries.length 而如果 queries[j] 存在著對應的路徑,則 answer[j] 為真(True);反之,則 answer[j] 為假(False)。

限制:
2 ≦ n ≦ 10 ^ 5
1 ≦ edgeList.length, queries.length ≦ 10 ^ 5
edgeList[i].length == 3
queries[j].length == 3
0 ≦ ui, vi, pj, qj ≦ n - 1
ui != vi
pj != qj
1 ≦ disi, limitj ≦ 10 ^ 9
兩個節點之間可能有多條邊存在。



範例測資:
範例 1:
輸入: n = 3, edgeList = [[0,1,2],[1,2,4],[2,0,8],[1,0,16]], queries = [[0,1,2],[0,2,5]]
輸出: [false,true]
解釋: 上圖代表著給定的圖。注意到 0 到 1 之間有兩條重邊存在,距離值各自為 2 和 16。
對於第一筆詢問,0 到 1 之間不存在著任何使得當中的邊之距離值小於 2 的路徑,因此對於此詢問我們將回傳假。
對於第二筆詢問,存在著有兩條邊的路徑 (0 -> 1 -> 2) 且距離值都小於 5,因此對於此詢問我們將回傳真。

範例 2:
輸入: n = 5, edgeList = [[0,1,10],[1,2,5],[2,3,9],[3,4,13]], queries = [[0,4,14],[1,4,13]]
輸出: [true,false]
解釋: 上圖代表著給定的圖。


解題思維:
這題其實有些類似,把所有邊按照距離小排到大,然後所有詢問也按照 limitj 之值由小排到大。這樣一來我們便可以逐漸地一一把邊加回到圖上直到即將超過 limitj 為止。此時如果 pj 和 qj 是在同一個 component 上,便代表著 pj 到 qj 之間存在著所求的路徑。

而在不在同一個 component 中,即是判斷兩者是否在「同一集合」。因此把邊加回到圖中可以視為併查集(Union-Find Set)中合併兩集合的操作,進而降低總體時間複雜度。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作