Transpose graph

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++



filter_none

edit
close

play_arrow

link
brightness_4
code

// 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;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# 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

chevron_right


Output:

0--> 2  
1--> 0  4  
2--> 3  
3--> 0  4  
4--> 0


My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.





Article Tags :
Practice Tags :


3


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.