Minimum degree of three nodes forming a triangle in a given Graph
Last Updated :
28 May, 2021
Given an undirected graph consisting of N vertices and M edges and an array edges[][], with each row representing two vertices connected by an edge, the task is to find the minimum degree of three nodes forming a triangle in the graph. If there doesn’t exist any triangle in the graph, then print “-1”.
Examples:
Input: N = 7, Edges = [[1, 2], [1, 3], [2, 3], [1, 4], [2, 5], [2, 7], [3, 6], [3, 7]]
Output: 4
Explanation: Below is the representation of the above graph:
There are two connected triangles:
- One formed by nodes {1, 2, 3}. Degree of the triangle = 5.
- Second triangle formed by nodes {2, 3, 7}. Degree of the triangle = 4.
The minimum degree is 4.
Input: N = 6, Edges = [[1, 2], [1, 3], [2, 3], [1, 6], [3, 4], [4, 5]]
Output: 2
Approach: The given problem can be solved by finding the degree of every triplet of nodes forming a triangle and count the degree of each node in that triangle. Follow the steps below to solve the problem:
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int minTrioDegree( int N,
vector<vector< int > >& Edges)
{
int degree[N + 1] = { 0 };
int adj[N + 1][N + 1] = { 0 };
for ( int i = 0; i < Edges.size(); i++) {
int u = Edges[i][0];
int v = Edges[i][1];
adj[u][v] = adj[u][v] = 1;
degree[u]++;
degree[v]++;
}
int ans = INT_MAX;
for ( int i = 1; i <= N; i++) {
for ( int j = i + 1; j <= N; j++) {
if (adj[i][j] == 1) {
for ( int k = j + 1;
k <= N; k++) {
if (adj[i][k] == 1
&& adj[j][k] == 1) {
ans = min(ans,
degree[i]
+ degree[j]
+ degree[k] - 6);
}
}
}
}
}
return ans == INT_MAX ? -1 : ans;
}
int main()
{
vector<vector< int > > Edges;
Edges = { { 1, 2 }, { 1, 3 },
{ 2, 3 }, { 1, 4 },
{ 2, 5 }, { 2, 7 },
{ 3, 6 }, { 3, 7 } };
int N = 7;
cout << minTrioDegree(N, Edges);
return 0;
}
|
Java
import java.util.*;
class GFG{
static int minTrioDegree( int N, int [][]Edges)
{
int degree[] = new int [N + 1 ];
int adj[][] = new int [N + 1 ][N + 1 ];
for ( int i = 0 ; i < Edges.length; i++) {
int u = Edges[i][ 0 ];
int v = Edges[i][ 1 ];
adj[u][v] = adj[u][v] = 1 ;
degree[u]++;
degree[v]++;
}
int ans = Integer.MAX_VALUE;
for ( int i = 1 ; i <= N; i++) {
for ( int j = i + 1 ; j <= N; j++) {
if (adj[i][j] == 1 ) {
for ( int k = j + 1 ;
k <= N; k++) {
if (adj[i][k] == 1
&& adj[j][k] == 1 ) {
ans = Math.min(ans,
degree[i]
+ degree[j]
+ degree[k] - 6 );
}
}
}
}
}
return ans == Integer.MAX_VALUE ? - 1 : ans;
}
public static void main(String[] args)
{
int [][]Edges = { { 1 , 2 }, { 1 , 3 },
{ 2 , 3 }, { 1 , 4 },
{ 2 , 5 }, { 2 , 7 },
{ 3 , 6 }, { 3 , 7 } };
int N = 7 ;
System.out.print(minTrioDegree(N, Edges));
}
}
|
Python3
import sys
def minTrioDegree(N, Edges):
degree = [ 0 ] * (N + 1 )
adj = []
for i in range ( 0 , N + 1 ):
temp = []
for j in range ( 0 , N + 1 ):
temp.append( 0 )
adj.append(temp)
for i in range ( len (Edges)):
u = Edges[i][ 0 ]
v = Edges[i][ 1 ]
adj[u][v] = adj[u][v] = 1
degree[u] + = 1
degree[v] + = 1
ans = sys.maxsize
for i in range ( 1 , N + 1 , 1 ):
for j in range (i + 1 , N + 1 , 1 ):
if adj[i][j] = = 1 :
for k in range (j + 1 , N + 1 , 1 ):
if (adj[i][k] = = 1 ) and (adj[j][k] = = 1 ):
ans = min (ans, degree[i] + degree[j] + degree[k] - 6 )
if ans = = sys.maxsize:
return - 1
return ans
Edges = [[ 1 , 2 ], [ 1 , 3 ], [ 2 , 3 ], [ 1 , 4 ], [ 2 , 5 ], [ 2 , 7 ], [ 3 , 6 ], [ 3 , 7 ]]
N = 7
print (minTrioDegree(N, Edges))
|
C#
using System;
using System.Collections.Generic;
public class GFG
{
static int minTrioDegree( int N, int [,]Edges)
{
int []degree = new int [N + 1];
int [,]adj = new int [N + 1, N + 1];
for ( int i = 0; i < Edges.GetLength(0); i++)
{
int u = Edges[i, 0];
int v = Edges[i, 1];
adj[u, v] = adj[u, v] = 1;
degree[u]++;
degree[v]++;
}
int ans = int .MaxValue;
for ( int i = 1; i <= N; i++) {
for ( int j = i + 1; j <= N; j++) {
if (adj[i,j] == 1) {
for ( int k = j + 1;
k <= N; k++) {
if (adj[i,k] == 1
&& adj[j,k] == 1) {
ans = Math.Min(ans,
degree[i]
+ degree[j]
+ degree[k] - 6);
}
}
}
}
}
return ans == int .MaxValue ? -1 : ans;
}
public static void Main(String[] args)
{
int [,]Edges = { { 1, 2 }, { 1, 3 },
{ 2, 3 }, { 1, 4 },
{ 2, 5 }, { 2, 7 },
{ 3, 6 }, { 3, 7 } };
int N = 7;
Console.Write(minTrioDegree(N, Edges));
}
}
|
Javascript
<script>
function minTrioDegree(N,Edges)
{
var degree = Array.from({length: N+1}, (_, i) => 0);
var adj = Array(N+1).fill(0).map(x => Array(N+1).fill(0));
for ( var i = 0; i < Edges.length; i++) {
var u = Edges[i][0];
var v = Edges[i][1];
adj[u][v] = adj[u][v] = 1;
degree[u]++;
degree[v]++;
}
var ans = Number.MAX_VALUE;
for ( var i = 1; i <= N; i++) {
for ( var j = i + 1; j <= N; j++) {
if (adj[i][j] == 1) {
for ( var k = j + 1;
k <= N; k++) {
if (adj[i][k] == 1
&& adj[j][k] == 1) {
ans = Math.min(ans,
degree[i]
+ degree[j]
+ degree[k] - 6);
}
}
}
}
}
return ans == Number.MAX_VALUE ? -1 : ans;
}
var Edges = [ [ 1, 2 ], [ 1, 3 ],
[ 2, 3 ], [ 1, 4 ],
[ 2, 5 ], [ 2, 7 ],
[ 3, 6 ], [ 3, 7 ] ];
var N = 7;
document.write(minTrioDegree(N, Edges));
</script>
|
Time Complexity: O(N3)
Auxiliary Space: O(N2)
Share your thoughts in the comments
Please Login to comment...