在一个给定图中构成一个三角形的三个节点的最小度
给定一个无向图组成的N顶点和m边和数组边缘[][],每个行代表由边缘连接的两个顶点,任务是找到形成a的三个节点的最小度图中的三角形。如果没有任何三角形图形然后打印“1”。
例子:
输入:N = 7,边缘=[[1,2],[1,3],[2、3],[1,4],[2、5],[2、7],[3、6],[3、7]]
输出:4.
解释:以下是上图的表示:有两个连接的三角形:
- 由节点{1,2,3}组成的节点。三角形的度= 5。
- 第二个三角形由节点{2,3,7}组成。三角形的度= 4。
最小次数是4。
输入:n = 6,边缘= [[1,2],[1,3],[2,3],[1,6],[3,4],[4,5]]
输出:2
方法:给定的问题可以解决发现的程度每个组成三角形和的节点的三重集合计算每个节点的度数在那个三角形。按照以下步骤解决问题:
- 例如,初始化一个变量答作为INT_MAX存储形成三角形的最小节点度。
- 从给定的边集创建一个邻接矩阵。
- 存储给定图形的每个节点的程度在辅助中数组说,度[]。
- 现在,对所有可能的三联体节点进行迭代(I,J,K)在范围内[1,n]并执行以下步骤:
- 如果每对三胞胎之间存在边缘,则存在一个三角形。因此,请更新答的最小值答和(度[i] +度[j] +度[k] - 6)。
- 否则,继续下一个迭代。
- 完成以上步骤后,如果值答是INT_MAX然后打印“1”。否则,打印值答作为图表中任何三角形的最小程度。
以下是实施上述方法:
C ++
// c++程序的上述方法
# include <比特/ stdc + + . h >
使用
名称空间
性病;
//求最小度数
//图中一个连通三角形的
int
minTrioDegree (
int
n,
矢量< <
int
> > &边缘)
{
//存储每个节点的度数
//在图表中
int
学位[n + 1] = {0};
的表示形式
//图的邻接矩阵
int
adj [n + 1] [n + 1] = {0};
//创建邻接矩阵和
//计算节点的程度
为了
(
int
我= 0;我< Edges.size ();I ++){
// u和v是的端点
// ith边缘
int
U =边缘[i] [0];
int
v =边缘[i] [1];
//标记边缘即,
//边u->v和v->u
Adj [u][v] = Adj [v] = 1;
//度数增加1
//两个结束节点
学位[u] ++;
学位[v] ++;
}
//存储所需的结果
int
ans = INT_MAX;
//遍历第一个节点
为了
(
int
我= 1;我<= n;I ++){
//遍历第二节点
为了
(
int
J = I + 1;j < = N;j + +) {
//如果之间存在边缘
//这两个节点
如果
(adj[i][j] == 1) {
//遍历所有可能的
/ /第三个节点
为了
(
int
K = j + 1;
k <= n;k ++){
//如果有边界
//第三节点之间
//和前两个
如果
(adj[我][k] = = 1
&& adj[j][k] == 1) {
//更新ans.
ans = min (ans,
学位(我)
+学位[j]
+ degree[k] - 6);
}
}
}
}
}
//返回结果
返回
ans == int_max?-1:ANS;
}
/ /驱动程序代码
int
main ()
{
矢量< <
int
> >边缘;
边= {{1,2},{1,3},
{2,3},{1,4},
{2,5},{2,7},
{3,6}, {3,7}};
int
n = 7;
cout << minTrioDegree(N, Edges);
返回
0;
}
|
输出:
4.
时间复杂性:上3.)
辅助空间:上2)