Skip to content
Related Articles

Related Articles

Transpose graph
  • Difficulty Level : Easy
  • Last Updated : 17 Feb, 2020
GeeksforGeeks - Summer Carnival Banner

Transpose of a directed graph G is another directed graph on the same set of vertices with all of the edges reversed compared to the orientation of the corresponding edges in G. That is, if G contains an edge (u, v) then the converse/transpose/reverse of G contains an edge (v, u) and vice versa.
Given a graph (represented as adjacency list), we need to find another graph which is the transpose of the given graph.

Example:

Transpose graph

Transpose Graph

Input : figure (i) is the input graph.
Output : figure (ii) is the transpose graph of the given graph.

We traverse the adjacency list and as we find a vertex v in the adjacency list of vertex u which indicates an edge from u to v in main graph, we just add an edge from v to u in the transpose graph i.e. add u in the adjacency list of vertex v of the new graph. Thus traversing lists of all vertices of main graph we can get the transpose graph. Thus the total time complexity of the algorithm is O(V+E) where V is number of vertices of graph and E is the number of edges of the graph.
Note : It is simple to get the transpose of a graph which is stored in adjacency matrix format, you just need to get the transpose of that matrix.

C++




// CPP program to find transpose of a graph.
#include <bits/stdc++.h>
using namespace std;
  
// function to add an edge from vertex source to vertex dest
void addEdge(vector<int> adj[], int src, int dest)
{
    adj[src].push_back(dest); 
}
  
// function to print adjacency list of a graph
void displayGraph(vector<int> adj[], int v)
{
    for (int i = 0; i < v; i++) {
        cout << i << "--> ";
        for (int j = 0; j < adj[i].size(); j++)
            cout << adj[i][j] << "  ";
        cout << "\n";
    }
}
  
// function to get Transpose of a graph taking adjacency
// list of given graph and that of Transpose graph
void transposeGraph(vector<int> adj[], 
                     vector<int> transpose[], int v)
{
    // traverse the adjacency list of given graph and
    // for each edge (u, v) add an edge (v, u) in the
    // transpose graph's adjacency list
    for (int i = 0; i < v; i++)
        for (int j = 0; j < adj[i].size(); j++)
            addEdge(transpose, adj[i][j], i);
}
  
int main()
{
    int v = 5;
    vector<int> adj[v];
    addEdge(adj, 0, 1);
    addEdge(adj, 0, 4);
    addEdge(adj, 0, 3);
    addEdge(adj, 2, 0);
    addEdge(adj, 3, 2);
    addEdge(adj, 4, 1);
    addEdge(adj, 4, 3);
  
    // Finding transpose of graph represented
    // by adjacency list adj[]
    vector<int> transpose[v];
    transposeGraph(adj, transpose, v);
  
    // displaying adjacency list of transpose 
    // graph i.e. b
    displayGraph(transpose, v);
  
    return 0;
}

Java




// Java program to find the transpose of a graph
import java.util.*;
import java.lang.*;
import java.io.*;
  
class Graph
{
    // Total number of vertices
    private static int vertices = 5;
      
    // Find transpose of graph represented by adj
    private static ArrayList<Integer>[] adj = new ArrayList[vertices];
     
    // Store the transpose of graph represented by tr
    private static ArrayList<Integer>[] tr = new ArrayList[vertices];
  
    // Function to add an edge from source vertex u to 
    // destination vertex v, if choice is false the edge is added
    // to adj otherwise the edge is added to tr
    public static void addedge(int u, int v, boolean choice)
    {
        if(!choice)
            adj[u].add(v);
        else
            tr[u].add(v);
    }
  
    // Function to print the graph representation
    public static void printGraph()
    {
        for(int i = 0; i < vertices; i++)
        {
            System.out.print(i + "--> ");
            for(int j = 0; j < tr[i].size(); j++)
                System.out.print(tr[i].get(j) + " ");
            System.out.println();
        }
    }
  
    // Function to print the transpose of 
    // the graph represented as adj and store it in tr
    public static void getTranspose()
    {
  
        // Traverse the graph and for each edge u, v 
        // in graph add the edge v, u in transpose
        for(int i = 0; i < vertices; i++)
            for(int j = 0; j < adj[i].size(); j++)
                addedge(adj[i].get(j), i, true);
    }
  
    public static void main (String[] args) throws java.lang.Exception
    {
        for(int i = 0; i < vertices; i++)
        {
            adj[i] = new ArrayList<Integer>();
            tr[i] = new ArrayList<Integer>();
        }
        addedge(0, 1, false);
        addedge(0, 4, false);
        addedge(0, 3, false);
        addedge(2, 0, false);
        addedge(3, 2, false);
        addedge(4, 1, false);
        addedge(4, 3, false);
          
        // Finding transpose of the graph 
        getTranspose();
          
        // Printing the graph representation
        printGraph();
    }
}
  
// This code is contributed by code_freak

Python3




# Python3 program to find transpose of a graph. 
  
# function to add an edge from vertex 
# source to vertex dest 
def addEdge(adj, src, dest):
    adj[src].append(dest)
  
# function to pradjacency list 
# of a graph 
def displayGraph(adj, v):
    for i in range(v):
        print(i, "--> ", end = "")
        for j in range(len(adj[i])):
            print(adj[i][j], end = " "
        print()
  
# function to get Transpose of a graph 
# taking adjacency list of given graph
# and that of Transpose graph 
def transposeGraph(adj, transpose, v):
      
    # traverse the adjacency list of given 
    # graph and for each edge (u, v) add 
    # an edge (v, u) in the transpose graph's
    # adjacency list
    for i in range(v):
        for j in range(len(adj[i])):
            addEdge(transpose, adj[i][j], i)
  
# Driver Code
if __name__ == '__main__':
  
    v = 5
    adj = [[] for i in range(v)] 
    addEdge(adj, 0, 1
    addEdge(adj, 0, 4
    addEdge(adj, 0, 3
    addEdge(adj, 2, 0
    addEdge(adj, 3, 2
    addEdge(adj, 4, 1
    addEdge(adj, 4, 3
  
    # Finding transpose of graph represented 
    # by adjacency list adj[] 
    transpose = [[]for i in range(v)]
    transposeGraph(adj, transpose, v) 
  
    # displaying adjacency list of 
    # transpose graph i.e. b 
    displayGraph(transpose, v)
  
# This code is contributed by PranchalK

C#




// C# program to find the transpose of a graph
using System;
using System.Collections.Generic;
  
class Graph
{
    // Total number of vertices
    private static int vertices = 5;
      
    // Find transpose of graph represented by adj
    private static List<int>[] adj = new List<int>[vertices];
      
    // Store the transpose of graph represented by tr
    private static List<int>[] tr = new List<int>[vertices];
  
    // Function to add an edge from source vertex u to 
    // destination vertex v, if choice is false the edge is added
    // to adj otherwise the edge is added to tr
    public static void addedge(int u, int v, bool choice)
    {
        if(!choice)
            adj[u].Add(v);
        else
            tr[u].Add(v);
    }
  
    // Function to print the graph representation
    public static void printGraph()
    {
        for(int i = 0; i < vertices; i++)
        {
            Console.Write(i + "--> ");
            for(int j = 0; j < tr[i].Count; j++)
                Console.Write(tr[i][j] + " ");
            Console.WriteLine();
        }
    }
  
    // Function to print the transpose of 
    // the graph represented as adj and store it in tr
    public static void getTranspose()
    {
  
        // Traverse the graph and for each edge u, v 
        // in graph add the edge v, u in transpose
        for(int i = 0; i < vertices; i++)
            for(int j = 0; j < adj[i].Count; j++)
                addedge(adj[i][j], i, true);
    }
  
    // Driver code
    public static void Main(String[] args)
    {
        for(int i = 0; i < vertices; i++)
        {
            adj[i] = new List<int>();
            tr[i] = new List<int>();
        }
        addedge(0, 1, false);
        addedge(0, 4, false);
        addedge(0, 3, false);
        addedge(2, 0, false);
        addedge(3, 2, false);
        addedge(4, 1, false);
        addedge(4, 3, false);
          
        // Finding transpose of the graph 
        getTranspose();
          
        // Printing the graph representation
        printGraph();
    }
}
  
  
// This code is contributed by Rajput-Ji
Output:
0--> 2  
1--> 0  4  
2--> 3  
3--> 0  4  
4--> 0

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.




My Personal Notes arrow_drop_up
Recommended Articles
Page :