LeetCode 5679. 一个图中连通三元组的最小度数(枚举)

题意:

给你一个无向图,整数 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;
    }
};

你可能感兴趣的:(LeetCode 5679. 一个图中连通三元组的最小度数(枚举))