ETH官方钱包

前往
大廳
主題

LeetCode - 0928. Minimize Malware Spread II 解題心得

Not In My Back Yard | 2023-11-24 12:00:01 | 巴幣 0 | 人氣 99

題目連結:


題目意譯:
你被給定一個有著 n 個節點的網路,其以一個 n × n 的鄰接矩陣(Adjacency Matrix)graph 所表示,其中如果 graph[i][j] == 1 則代表著第 i 個節點與第 j 個節點是直接相連的。

在整數陣列 initial 中有些節點一開始就被惡意軟體感染。而每當有兩個直接相連的節點且至少其中一個已經被惡意軟體感染,則兩個節點都將被惡意軟體感染。這個擴散將持續到沒有節點可以被感染為止。

假設 M(initial) 是在惡意軟體的擴散停止之後在整個網路中被感染的節點個數。

我們將會從 initial 中移除恰好一個節點,其將會把它與任何其他節點的連結也一併刪除。

回傳在被移除之後將會最小化 M(initial) 的節點。如果有多個節點可以被移除來最小化 M(initial),回傳索引值最小者。

限制:
n == graph.length
n == graph[i].length
2 ≦ n ≦ 300
graph[i][j] is 0 or 1.
graph[i][j] == graph[j][i]
graph[i][i] == 1
1 ≦ initial.length < n
0 ≦ initial[i] ≦ n - 1
在 initial 中的所有整數彼此相異。



範例測資:
範例 1:
輸入: graph = [[1,1,0],[1,1,0],[0,0,1]], initial = [0,1]
輸出: 0

範例 2:
輸入: graph = [[1,1,0],[1,1,1],[0,1,1]], initial = [0,1]
輸出: 1

範例 3:
輸入: graph = [[1,1,0,0],[1,1,1,0],[0,1,1,1],[0,0,1,1]], initial = [0,1]
輸出: 1


解題思維:
作法跟昨天的題目很類似。不過因為現在移除某個節點會使得以該節點作為其中一個端點的邊也會跟著被移除,因此網路的結構會有所改變。所以我們現在要先窮舉要移除 initial 中的哪個節點,然後才建立併查集(Union-Find Set),當然記得要忽略要被刪除的節點與其關聯的邊。然後跟昨天的題目一樣地掃過每一個「集合」(這次不需要存最初感染者的數量,因為我們是直接窮舉要移除的節點)並求出最後總感染節點數。

然後取可以把 M(initial) 最小化且索引值最小的節點即可。




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

創作回應

更多創作