題目連結:
題目意譯:
你被給定一整數 n 代表著一網路中的人數。每個人被編號為 0 到 n - 1。
你同時也被給定一個索引值從 0 開始之二維整數陣列 restrictions,其中 restrictions[i] = [xi, yi] 意味著編號 xi 的人與編號 yi 的人不能成為朋友,不論是直接地還是經由他人間接地成為朋友。
一開始,沒有人是彼此的朋友。你被給定一個索引值從 0 開始之二維整數陣列 requests 作為好友請求序列,其中 requests[j] = [uj, vj] 為一個編號 uj 的人與編號 vj 的人之間的好友請求。
如果 uj 和 vj 可以成為朋友,則該好友請求是成功的。每個好友請求根據其給定順序來處理(即,requests[j] 發生於 requests[j + 1] 之前),且 uj 和 vj 將對於未來所有其他的好友請求都是直接性的朋友。
回傳一個布林陣列 result,其中每個 result[j] 為真(True)如果第 j 個朋友請求是成功的;反之,為假(False)。
注: 如果 uj 和 vj 已經是直接的朋友了,該次請求依舊算為成功。
限制:
2 ≦ n ≦ 1000
0 ≦ restrictions.length ≦ 1000
restrictions[i].length == 2
0 ≦ xi, yi ≦ n - 1
xi != yi
1 ≦ requests.length ≦ 1000
requests[j].length == 2
0 ≦ uj, vj ≦ n - 1
uj != vj
範例測資:
範例 1:
輸入: n = 3, restrictions = [[0,1]], requests = [[0,2],[2,1]]
輸出: [true,false]
解釋:
請求 0:編號 0 與編號 2 可以成為朋友,所以他們便成為了直接的朋友。
請求 1:編號 2 和編號 1 無法成為朋友,因為編號 0 和編號 1 將會變成間接的朋友(1--2--0)。
範例 2:
輸入: n = 3, restrictions = [[0,1]], requests = [[1,2],[0,2]]
輸出: [true,false]
解釋:
請求 0:編號 1 與編號 2 可以成為朋友,所以他們便成為了直接的朋友。
請求 1:編號 0 和編號 2 無法成為朋友,因為編號 0 和編號 1 將會變成間接的朋友(0--2--1)。
範例 3:
輸入: n = 5, restrictions = [[0,1],[1,2],[2,3]], requests = [[0,4],[1,2],[3,1],[3,4]]
輸出: [true,false,true,false]
解釋:
請求 0:編號 0 與編號 4 可以成為朋友,所以他們便成為了直接的朋友。
請求 1:編號 1 和編號 2 無法成為朋友,因為他們之間有直接的限制。
請求 2:編號 3 與編號 1 可以成為朋友,所以他們便成為了直接的朋友。
請求 3:編號 3 和編號 4 無法成為朋友,因為編號 0 和編號 1 將會變成間接的朋友(0--4--3--1)。
解題思維:
這題可以簡單地從併查集(Union-Find Set)修改一下便可以解掉。
在
這題中有介紹過併查集,而一般的表示法為森林(Forest)的方式。
而原本一般是取樹中某個節點作為「代表」(Representative),其將儲存著其下(即該棵樹整體)有幾個節點,且每個節點存自己的 parent。現在我們可以讓「代表」多存一些資訊——即現在它所在的樹是哪些節點(建議用布林陣列表示誰在、誰不在比較方便)以及整棵樹的所有節點限制合併後不能跟哪些節點作為朋友。然後合併的時候,利用這些資訊判斷可不可以合併(成為直接的朋友)。不行就回傳假;可以的話,記得更新這些資訊,並回傳真即可。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。