5679. 一個圖中連通三元組的最小度數
阿新 • • 發佈:2021-02-15
技術標籤:Floyd
難度困難
給你一個無向圖,整數n
表示圖中節點的數目,edges
陣列表示圖中的邊,其中edges[i] = [ui, vi]
,表示ui
和vi
之間有一條無向邊。
一個連通三元組指的是三個節點組成的集合且這三個點之間兩兩有邊。
連通三元組的度數是所有滿足此條件的邊的數目:一個頂點在三元組內,而另一個頂點不在三元組內。
請你返回所有連通三元組中度數的最小值,如果圖中沒有連通三元組,那麼返回-1
。
示例 1:
輸入:n = 6, edges = [[1,2],[1,3],[3,2],[4,1],[5,2],[3,6]] 輸出:3 解釋:只有一個三元組 [1,2,3] 。構成度數的邊在上圖中已被加粗。
示例 2:
輸入:n = 7, edges = [[1,3],[4,1],[4,3],[2,5],[5,6],[6,7],[7,5],[2,6]]
輸出:0
解釋:有 3 個三元組:
1) [1,4,3],度數為 0 。
2) [2,5,6],度數為 2 。
3) [5,6,7],度數為 2 。
提示:
2 <= n <= 400
edges[i].length == 2
1 <= edges.length <= n * (n-1) / 2
1 <= ui, vi<= n
ui!= vi
- 圖中沒有重複的邊。
這道題一個重要的提示在於資料量<=400,因此可以採用時間複雜度為O(n^3)
參考Floyd演算法,根據輸入的邊構建鄰接矩陣(鄰接連結串列也可以),通過遍歷所有的相連節點i、j,判斷是否存在第三個節點k與i、j 均相連構成三元組。對每個三元組求其三元組的度數(即i、j、k三點度數和 - 6)。維護最小值即可。
class Solution { public: bool room[401][401]; int Du[401]; int minTrioDegree(int n, vector<vector<int>>& edges) { memset(room, 0, sizeof(room)); memset(Du, 0, sizeof(Du)); for (auto i : edges) { room[i[0]][i[1]] = 1; room[i[1]][i[0]] = 1; Du[i[0]]++; Du[i[1]]++; } int res = edges.size(); for (int i = 1; i < n + 1; ++i) { for (int j = 1; j < n + 1; ++j) { if (!room[i][j]) continue; for (int k = 1; k < n + 1; ++k) { if (room[i][k] && room[k][j]) { res = min(res, Du[i] + Du[j] + Du[k] - 6); } } } } return res == edges.size() ? -1 : res; } };