Find if a degree sequence can form a simple graph | HavelHakimi Algorithm (original) (raw)

Last Updated : 24 Jun, 2024

Given a sequence of non-negative integers **arr[], the task is to check if there exists a simple graph corresponding to this degree sequence. **Note that a simple graph is a graph with no self-loops and parallel edges.

**Examples:

**Input: arr[] = {3, 3, 3, 3}
**Output: Yes
This is actually a complete graph(K4)

**Input: arr[] = {3, 2, 1, 0}
**Output: No
A vertex has degree n-1 so it's connected to all the other n-1 vertices.
But another vertex has degree 0 i.e. isolated. It's a contradiction.

**Approach: One way to check the existence of a simple graph is by Havel-Hakimi algorithm given below:

Stopping conditions:

Below is the implementation of the above approach:

C++ `

// C++ implementation of the approach #include <bits/stdc++.h> using namespace std;

// Function that returns true if // a simple graph exists bool graphExists(vector &a, int n) { // Keep performing the operations until one // of the stopping condition is met while (1) { // Sort the list in non-decreasing order sort(a.begin(), a.end(), greater<>());

    // Check if all the elements are equal to 0
    if (a[0] == 0)
        return true;

    // Store the first element in a variable
    // and delete it from the list
    int v = a[0];
    a.erase(a.begin() + 0);

    // Check if enough elements
    // are present in the list
    if (v > a.size())
        return false;

    // Subtract first element from next v elements
    for (int i = 0; i < v; i++)
    {
        a[i]--;

        // Check if negative element is
        // encountered after subtraction
        if (a[i] < 0)
            return false;
    }
}

}

// Driver Code int main() { vector a = {3, 3, 3, 3}; int n = a.size();

graphExists(a, n) ? cout << "Yes" : 
                    cout << "NO" << endl;

return 0;

}

// This code is contributed by // sanjeev2552

Java

// Java implementation of the approach import java.util.*;

@SuppressWarnings("unchecked")

class GFG{

// Function that returns true if // a simple graph exists static boolean graphExists(ArrayList a, int n) {

// Keep performing the operations until one 
// of the stopping condition is met 
while (true) 
{ 
    
    // Sort the list in non-decreasing order 
    Collections.sort(a, Collections.reverseOrder());
     
    // Check if all the elements are equal to 0 
    if ((int)a.get(0) == 0) 
        return true; 

    // Store the first element in a variable 
    // and delete it from the list 
    int v = (int)a.get(0); 
    a.remove(a.get(0)); 

    // Check if enough elements 
    // are present in the list 
    if (v > a.size()) 
        return false; 

    // Subtract first element from 
    // next v elements 
    for(int i = 0; i < v; i++) 
    { 
        a.set(i, (int)a.get(i) - 1);

        // Check if negative element is 
        // encountered after subtraction 
        if ((int)a.get(i) < 0) 
            return false; 
    } 
} 

}

// Driver Code public static void main(String[] args) { ArrayList a = new ArrayList(); a.add(3); a.add(3); a.add(3); a.add(3);

int n = a.size(); 
 
if (graphExists(a, n))
{
    System.out.print("Yes");
}
else
{
    System.out.print("NO");
}

} }

// This code is contributed by pratham76

Python

Python3 implementation of the approach

Function that returns true if

a simple graph exists

def graphExists(a):

# Keep performing the operations until one 
# of the stopping condition is met
while True: 

    # Sort the list in non-decreasing order
    a = sorted(a, reverse = True)

    # Check if all the elements are equal to 0
    if a[0]== 0 and a[len(a)-1]== 0:
        return True

    # Store the first element in a variable
    # and delete it from the list
    v = a[0]
    a = a[1:]

    # Check if enough elements 
    # are present in the list
    if v>len(a): 
        return False

    # Subtract first element from next v elements
    for i in range(v):
        a[i]-= 1

        # Check if negative element is 
        # encountered after subtraction
        if a[i]<0:
            return False

Driver code

a = [3, 3, 3, 3] if(graphExists(a)): print("Yes") else: print("No")

C#

// C# implementation of the approach using System; using System.Collections;

class GFG{

// Function that returns true if // a simple graph exists static bool graphExists(ArrayList a, int n) {

// Keep performing the operations until one 
// of the stopping condition is met 
while (true) 
{ 
    
    // Sort the list in non-decreasing order 
    a.Sort();
    a.Reverse();
    
    // Check if all the elements are equal to 0 
    if ((int)a[0] == 0) 
        return true; 

    // Store the first element in a variable 
    // and delete it from the list 
    int v = (int)a[0]; 
    a.Remove(a[0]); 

    // Check if enough elements 
    // are present in the list 
    if (v > a.Count) 
        return false; 

    // Subtract first element from 
    // next v elements 
    for(int i = 0; i < v; i++) 
    { 
        a[i] = (int)a[i] - 1; 

        // Check if negative element is 
        // encountered after subtraction 
        if ((int)a[i] < 0) 
            return false; 
    } 
} 

}

// Driver Code public static void Main(string[] args) { ArrayList a = new ArrayList(){ 3, 3, 3, 3 }; int n = a.Count;

if (graphExists(a, n))
{
    Console.Write("Yes");
}
else
{
    Console.Write("NO");
}

} }

// This code is contributed by rutvik_56

JavaScript

`

**Time Complexity: O(N^2*logN)
**Auxiliary Space: O(1)