题意:
给你一个无向图,整数 n 表示图中节点的数目,edges 数组表示图中的边,
其中 edges[i] = [ui, vi] ,表示 ui 和 vi 之间有一条无向边。
一个 连通三元组 指的是 三个 节点组成的集合且这三个点之间 两两 有边。
连通三元组的度数 是所有满足此条件的边的数目:一个顶点在三元组内,而另一个顶点不在三元组内。
请你返回所有连通三元组中度数的 最小值 ,如果图中没有连通三元组,那么返回 -1 。
数据范围:
2 <= n <= 400
edges[i].length == 2
1 <= edges.length <= n * (n-1) / 2
1 <= ui, vi <= n
ui != vi
图中没有重复的边。
解法:
观察到n<=400,支持O(n^3)算法.
那么枚举点i,j,k,如果他们能组成三元环,那么用d[i]+d[i]+d[k]-2更新答案即可.
其中d[i]是点i的度数.
判断i,j,k能否组成三元环可以预处理邻接矩阵g[i][j]=0/1,等于1时说明有边.
code:
class Solution {
public:
int g[444][444];
int d[444];
int minTrioDegree(int n, vector<vector<int>>& e) {
memset(d,0,sizeof d);
memset(g,0,sizeof g);
for(auto i:e){
int x=i[0],y=i[1];
d[x]++,d[y]++;
g[x][y]=g[y][x]=1;
}
int ans=-1;
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
if(!g[j][i])continue;
for(int k=j+1;k<=n;k++){
if(!g[k][i]||!g[k][j])continue;
int temp=d[i]+d[j]+d[k]-6;
if(ans==-1||temp<ans){
ans=temp;
}
}
}
}
return ans;
}
};