Transpose graph
Last Updated :
26 Feb, 2024
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:
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.
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
void addEdge(vector< int > adj[], int src, int dest)
{
adj[src].push_back(dest);
}
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" ;
}
}
void transposeGraph(vector< int > adj[],
vector< int > transpose[], int v)
{
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);
vector< int > transpose[v];
transposeGraph(adj, transpose, v);
displayGraph(transpose, v);
return 0;
}
|
Java
import java.util.*;
import java.lang.*;
import java.io.*;
class Graph
{
private static int vertices = 5 ;
private static ArrayList<Integer>[] adj = new ArrayList[vertices];
private static ArrayList<Integer>[] tr = new ArrayList[vertices];
public static void addedge( int u, int v, boolean choice)
{
if (!choice)
adj[u].add(v);
else
tr[u].add(v);
}
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();
}
}
public static void getTranspose()
{
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 );
getTranspose();
printGraph();
}
}
|
Python3
def addEdge(adj, src, dest):
adj[src].append(dest)
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 ()
def transposeGraph(adj, transpose, v):
for i in range (v):
for j in range ( len (adj[i])):
addEdge(transpose, adj[i][j], i)
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 )
transpose = [[] for i in range (v)]
transposeGraph(adj, transpose, v)
displayGraph(transpose, v)
|
C#
using System;
using System.Collections.Generic;
class Graph
{
private static int vertices = 5;
private static List< int >[] adj = new List< int >[vertices];
private static List< int >[] tr = new List< int >[vertices];
public static void addedge( int u, int v, bool choice)
{
if (!choice)
adj[u].Add(v);
else
tr[u].Add(v);
}
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();
}
}
public static void getTranspose()
{
for ( int i = 0; i < vertices; i++)
for ( int j = 0; j < adj[i].Count; j++)
addedge(adj[i][j], i, true );
}
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 );
getTranspose();
printGraph();
}
}
|
Javascript
<script>
function addEdge(adj, src, dest) {
adj[src].push(dest)
}
function displayGraph(adj, v) {
for (let i = 0; i < v; i++) {
document.write(i + "--> " )
for (let j = 0; j < adj[i].length; j++) {
document.write(adj[i][j] + " " )
}
document.write( "<br>" )
}
}
function transposeGraph(adj, transpose, v) {
for (let i = 0; i < v; i++)
for (let j = 0; j < adj[i].length; j++)
addEdge(transpose, adj[i][j], i)
}
let v = 5
let adj = new Array(v).fill(0).map(() => new Array())
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)
let transpose = new Array(v).fill(0).map(() => new Array())
transposeGraph(adj, transpose, v)
displayGraph(transpose, v)
</script>
|
Output
0--> 2
1--> 0 4
2--> 3
3--> 0 4
4--> 0
Time Complexity:
The time complexity of the addEdge function is O(1), as it simply appends an element to the vector.
The time complexity of the displayGraph function is O(V + E), where V is the number of vertices and E is the number of edges, as it needs to traverse the adjacency list of each vertex and print out the adjacent vertices.
The time complexity of the transposeGraph function is also O(V + E), where V is the number of vertices and E is the number of edges, as it needs to traverse the adjacency list of each vertex and add the corresponding edges to the transpose graph’s adjacency list.
Therefore, the overall time complexity of the program is O(V + E).
Space complexity:
In terms of space complexity, the program uses two arrays of vectors to represent the original graph and its transpose, each of which has a size of V (the number of vertices). Additionally, the program uses a constant amount of space to store integer variables and temporary data structures. Therefore, the space complexity of the program is O(V).
Note that the space complexity of the program could be larger if the input graph has a large number of edges, as this would require more memory to store the adjacency lists.
Please Login to comment...