#力扣 LeetCode888. 公平的糖果棒交換 @FDDLC
阿新 • • 發佈:2021-02-11
技術標籤:LeetCode
題目描述:
給你一個無向圖,整數 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
示例 2:
輸入:n = 7, edges = [[1,3],[4,1],[4,3],[2,5],[5,6],[6,7],[7,5],[2,6]]
輸出:0
解釋:有 3 個三元組:
- [1,4,3],度數為 0 。
- [2,5,6],度數為 2 。
- [5,6,7],度數為 2 。
提示:
2 <= n <= 400
edges[i].length == 2
1 <= edges.length <= n * (n-1) / 2
1 <= ui, vi <= n
ui != vi
圖中沒有重複的邊。
方法1:
主要思路:解題連結彙總
(1)暴力求解;
(2)使用unordered_set超時,改為使用陣列標識;
class Solution {
public:
int minTrioDegree(int n, vector<vector<int>>& edges) {
int res=INT_MAX;
vector<vector<bool>> graph(n+1,vector<bool>(n+1,false));
vector<int> degrees(n+1,0) ;
for(vector<int>&e:edges){
//標識出存在邊的結點
graph[e[0]][e[1]]=true;
graph[e[1]][e[0]]=true;
//統計每個結點的度
++degrees[e[0]];
++degrees[e[1]];
}
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
if(graph[i][j]==false){
continue;
}
for(int k=1;k<=n;++k){
if(graph[j][k]==false){
continue;
}
if(graph[i][k]==true){//說明形成了長度為3的環
res=min(res,degrees[i]+degrees[j]+degrees[k]-6);
}
}
}
}
return res==INT_MAX?-1:res;
}
};