題目連結:
題目意譯:
現在有一個由 n 個編號為 0 到 n - 1 的節點所組成之無向圖。你被給定一個索引值從 0 開始且長度為 n 的整數陣列 vals,其中 vals[i] 代表著第 i 個節點的數值。
你同時也被給定一個二維整數陣列 edges,其中 edges[i] = [ai, bi] 代表著節點 ai 和節點 bi 之間有一條無向邊連接彼此。
一個星形圖(Star Graph)為給定的圖中的一個子圖,其有著一個中心節點並有著 0 或多個鄰居。換句話說,其代表著一個 edges 的子集合使得在該集合的邊中存在著一個共同的節點作為端點。
下圖依序顯示了有著 3 和 4 個鄰居且以藍色節點作為中心的星形圖。
星形總和(Star Sum)為在一個星形圖之中的所有節點之數值總和。
給定一整數 k,回傳最多包含著 k 條邊的那些星形圖之中星形總和之最大值。
限制:
n == vals.length
1 ≦ n ≦ 10 ^ 5
-10 ^ 4 ≦ vals[i] ≦ 10 ^ 4
0 ≦ edges.length ≦ min(n × (n - 1) / 2, 10 ^ 5)
edges[i].length == 2
0 ≦ ai, bi ≦ n - 1
ai != bi
0 ≦ k ≦ n - 1
範例測資:
範例 1:
輸入: vals = [1,2,3,4,10,-10,-20], edges = [[0,1],[1,2],[1,3],[3,4],[3,5],[3,6]], k = 2
輸出: 16
解釋: 上圖代表著輸入的圖。
有著最大星形總和的星形圖以藍色標記。其以 3 作為中心並包含著 1 和 4 作為鄰居。
可以證明無法得到一個總和大過 16 的星形圖。
範例 2:
輸入: vals = [-5], edges = [], k = 0
輸出: -5
解釋: 只有一個可能的星形圖存在,其即為節點 0 本身。
因此我們回傳 -5。
解題思維:
可以先建立鄰接表(Adjacency List,參見
這題)或類似的東西來記錄每一個節點的鄰居。
接著窮舉每一個節點作為星形圖的中心,接著選擇它的鄰居中數值前 k 大且非負(不夠選則盡量選),便可以得到以該節點作為中心可以得到的最大星形總和(記得不要忘記加上中心節點本身的數值)。
最後取每一個節點能得到的最大星形總和中的最大值即為所求。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。