题目描述
给定一个无向图,整数 n
表示图中节点的数目,edges
数组表示图中的边,其中 edges[i] = [ui, vi]
,表示节点 ui
和节点 vi
之间有一条无向边。
一个 连通三元组 指的是三个节点组成的集合且这三个点之间两两有边。
连通三元组的度数 是所有满足此条件的边的数目:一个顶点在这个三元组内,而另一个顶点不在这个三元组内。
请你返回所有连通三元组中度数的最小值,如果图中没有连通三元组,那么返回 -1。
解题思路
我们可以使用邻接矩阵来表示图中的连接关系。对于每个节点,我们可以计算出它的度数,即与它相邻的节点的个数。然后,我们遍历所有可能的三个节点组合 (i, j, k)
,检查是否存在边连接这三个节点。
如果存在连接 (i, j)
、(j, k)
和 (i, k)
这三条边,说明这是一个连通三元组。我们可以计算出这个连通三元组的度数,即节点 i
、j
和 k
的度数之和减去 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;
}
};