LeetCode每日一题 1761. 一个图中连通三元组的最小度数

题目描述

给定一个无向图,整数 n 表示图中节点的数目,edges 数组表示图中的边,其中 edges[i] = [ui, vi],表示节点 ui 和节点 vi 之间有一条无向边。

一个 连通三元组 指的是三个节点组成的集合且这三个点之间两两有边。

连通三元组的度数 是所有满足此条件的边的数目:一个顶点在这个三元组内,而另一个顶点不在这个三元组内。

请你返回所有连通三元组中度数的最小值,如果图中没有连通三元组,那么返回 -1。
示例图

解题思路

我们可以使用邻接矩阵来表示图中的连接关系。对于每个节点,我们可以计算出它的度数,即与它相邻的节点的个数。然后,我们遍历所有可能的三个节点组合 (i, j, k),检查是否存在边连接这三个节点。

如果存在连接 (i, j)(j, k)(i, k) 这三条边,说明这是一个连通三元组。我们可以计算出这个连通三元组的度数,即节点 ijk 的度数之和减去 6,因为这个度数计算了冗余的边。

我们遍历所有可能的三个节点组合,计算出每个连通三元组的度数,然后找到所有连通三元组中度数的最小值。

代码实现

class Solution {
public:
    int minTrioDegree(int n, vector<vector<int>>& edges) {
        vector<vector<bool>> adjMatrix(n + 1, vector<bool>(n + 1, false)); // 邻接矩阵
        vector<int> degree(n + 1, 0); // 节点的度数

        // 填充邻接矩阵并计算节点度数
        for (const auto& edge : edges) {
            int u = edge[0], v = edge[1];
            adjMatrix[u][v] = adjMatrix[v][u] = true;
            degree[u]++;
            degree[v]++;
        }

        int minDegree = INT_MAX;

        // 遍历所有可能的三个节点组合
        for (int i = 1; i <= n; i++) {
            for (int j = i + 1; j <= n; j++) {
                for (int k = j + 1; k <= n; k++) {
                    // 判断是否存在连接这三个节点的边
                    if (adjMatrix[i][j] && adjMatrix[j][k] && adjMatrix[i][k]) {
                        // 计算连通三元组的度数
                        int trioDegree = degree[i] + degree[j] + degree[k] - 6;
                        // 更新最小度数
                        minDegree = min(minDegree, trioDegree);
                    }
                }
            }
        }

        // 返回最小度数,若没有连通三元组则返回 -1
        return (minDegree == INT_MAX) ? -1 : minDegree;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值