Open In App
Related Articles

Count number of edges in an undirected graph

Improve Article
Improve
Save Article
Save
Like Article
Like

Given an adjacency list representation undirected graph. Write a function to count the number of edges in the undirected graph. Expected time complexity : O(V) Examples:

Input : Adjacency list representation of
        below graph.  
Output : 9

Idea is based on Handshaking Lemma. Handshaking lemma is about undirected graph. In every finite undirected graph number of vertices with odd degree is always even. The handshaking lemma is a consequence of the degree sum formula (also sometimes called the handshaking lemma)

     

So we traverse all vertices, compute sum of sizes of their adjacency lists, and finally returns sum/2. Below implementation of above idea 

C++




// C++ program to count number of edge in
// undirected graph
#include<bits/stdc++.h>
using namespace std;
 
// Adjacency list representation of graph
class Graph
{
    int V ;
    list < int > *adj;
public :
    Graph( int V )
    {
        this->V = V ;
        adj = new list<int>[V];
    }
    void addEdge ( int u, int v ) ;
    int countEdges () ;
};
 
// add edge to graph
void Graph :: addEdge ( int u, int v )
{
    adj[u].push_back(v);
    adj[v].push_back(u);
}
 
// Returns count of edge in undirected graph
int Graph :: countEdges()
{
    int sum = 0;
 
    //traverse all vertex
    for (int i = 0 ; i < V ; i++)
 
        // add all edge that are linked to the
        // current vertex
        sum += adj[i].size();
 
 
    // The count of edge is always even because in
    // undirected graph every edge is connected
    // twice between two vertices
    return sum/2;
}
 
// driver program to check above function
int main()
{
    int V = 9 ;
    Graph g(V);
 
    // making above shown graph
    g.addEdge(0, 1 );
    g.addEdge(0, 7 );
    g.addEdge(1, 2 );
    g.addEdge(1, 7 );
    g.addEdge(2, 3 );
    g.addEdge(2, 8 );
    g.addEdge(2, 5 );
    g.addEdge(3, 4 );
    g.addEdge(3, 5 );
    g.addEdge(4, 5 );
    g.addEdge(5, 6 );
    g.addEdge(6, 7 );
    g.addEdge(6, 8 );
    g.addEdge(7, 8 );
 
    cout << g.countEdges() << endl;
 
    return 0;
}

Java




// Java program to count number of edge in
// undirected graph
import java.io.*;
import java.util.*;
 
// Adjacency list representation of graph
class Graph
{
    int V;
    Vector<Integer>[] adj;
 
    //@SuppressWarnings("unchecked")
    Graph(int V)
    {
        this.V = V;
        this.adj = new Vector[V];
 
        for (int i = 0; i < V; i++)
            adj[i] = new Vector<Integer>();
    }
 
    // add edge to graph
    void addEdge(int u, int v)
    {
        adj[u].add(v);
        adj[v].add(u);
    }
 
    // Returns count of edge in undirected graph
    int countEdges()
    {
        int sum = 0;
 
        // traverse all vertex
        for (int i = 0; i < V; i++)
 
            // add all edge that are linked to the
            // current vertex
            sum += adj[i].size();
 
        // The count of edge is always even because in
        // undirected graph every edge is connected
        // twice between two vertices
        return sum / 2;
    }
}
 
class GFG
{
 
    // Driver Code
    public static void main(String[] args) throws IOException
    {
        int V = 9;
        Graph g = new Graph(V);
 
        // making above shown graph
        g.addEdge(0, 1);
        g.addEdge(0, 7);
        g.addEdge(1, 2);
        g.addEdge(1, 7);
        g.addEdge(2, 3);
        g.addEdge(2, 8);
        g.addEdge(2, 5);
        g.addEdge(3, 4);
        g.addEdge(3, 5);
        g.addEdge(4, 5);
        g.addEdge(5, 6);
        g.addEdge(6, 7);
        g.addEdge(6, 8);
        g.addEdge(7, 8);
 
        System.out.println(g.countEdges());
    }
}
 
// This code is contributed by
// sanjeev2552

Python3




# Python3 program to count number of
# edge in undirected graph
 
# Adjacency list representation of graph
class Graph:
    def __init__(self, V):
        self.V = V
        self.adj = [[] for i in range(V)]
 
    # add edge to graph
    def addEdge (self, u, v ):
        self.adj[u].append(v)
        self.adj[v].append(u)
     
    # Returns count of edge in undirected graph
    def countEdges(self):
        Sum = 0
     
        # traverse all vertex
        for i in range(self.V):
     
            # add all edge that are linked
            # to the current vertex
            Sum += len(self.adj[i])
     
        # The count of edge is always even 
        # because in undirected graph every edge 
        # is connected twice between two vertices
        return Sum // 2
 
# Driver Code
if __name__ == '__main__':
     
    V = 9
    g = Graph(V)
 
    # making above shown graph
    g.addEdge(0, 1 )
    g.addEdge(0, 7 )
    g.addEdge(1, 2 )
    g.addEdge(1, 7 )
    g.addEdge(2, 3 )
    g.addEdge(2, 8 )
    g.addEdge(2, 5 )
    g.addEdge(3, 4 )
    g.addEdge(3, 5 )
    g.addEdge(4, 5 )
    g.addEdge(5, 6 )
    g.addEdge(6, 7 )
    g.addEdge(6, 8 )
    g.addEdge(7, 8 )
 
    print(g.countEdges())
 
# This code is contributed by PranchalK

C#




// C# program to count number of edge in
// undirected graph
using System;
using System.Collections.Generic;
 
// Adjacency list representation of graph
class Graph
{
    public int V;
    public List<int>[] adj;
    public Graph(int V)
    {
        this.V = V;
        this.adj = new List<int>[V];
 
        for (int i = 0; i < V; i++)
            adj[i] = new List<int>();
    }
 
    // add edge to graph
    public void addEdge(int u, int v)
    {
        adj[u].Add(v);
        adj[v].Add(u);
    }
 
    // Returns count of edge in undirected graph
    public int countEdges()
    {
        int sum = 0;
 
        // traverse all vertex
        for (int i = 0; i < V; i++)
 
            // add all edge that are linked to the
            // current vertex
            sum += adj[i].Count;
 
        // The count of edge is always even because in
        // undirected graph every edge is connected
        // twice between two vertices
        return sum / 2;
    }
}
 
class GFG
{
 
    // Driver Code
    public static void Main(String[] args)
    {
        int V = 9;
        Graph g = new Graph(V);
 
        // making above shown graph
        g.addEdge(0, 1);
        g.addEdge(0, 7);
        g.addEdge(1, 2);
        g.addEdge(1, 7);
        g.addEdge(2, 3);
        g.addEdge(2, 8);
        g.addEdge(2, 5);
        g.addEdge(3, 4);
        g.addEdge(3, 5);
        g.addEdge(4, 5);
        g.addEdge(5, 6);
        g.addEdge(6, 7);
        g.addEdge(6, 8);
        g.addEdge(7, 8);
 
        Console.WriteLine(g.countEdges());
    }
}
 
// This code is contributed by PrinciRaj1992

Javascript




class Graph {
  constructor(V) {
    this.V = V;
    this.adj = new Array(V);
    for (let i = 0; i < V; i++) {
      this.adj[i] = [];
    }
  }
 
  addEdge(u, v) {
    this.adj[u].push(v);
    this.adj[v].push(u);
  }
 
  countEdges() {
    let sum = 0;
    for (let i = 0; i < this.V; i++) {
      sum += this.adj[i].length;
    }
    return sum / 2;
  }
}
 
function main() {
  let V = 9;
  let g = new Graph(V);
  g.addEdge(0, 1);
  g.addEdge(0, 7);
  g.addEdge(1, 2);
  g.addEdge(1, 7);
  g.addEdge(2, 3);
  g.addEdge(2, 8);
  g.addEdge(2, 5);
  g.addEdge(3, 4);
  g.addEdge(3, 5);
  g.addEdge(4, 5);
  g.addEdge(5, 6);
  g.addEdge(6, 7);
  g.addEdge(6, 8);
  g.addEdge(7, 8);
  console.log(g.countEdges());
}
 
main();
// this code is contributed by devendra

Output:

14

Time Complexity: O(V) This article is contributed by Nishant Singh. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.


Last Updated : 06 Feb, 2023
Like Article
Save Article
Similar Reads
Related Tutorials