Problem Statement:
Implement Topological Sorting, for the given Directed Acyclic Graph (DAG)
Solution :
Note: Graph should be Directed Acyclic Graph (DAG)
Full Source Code : Link
What is Topological ordering or topological sort ?
Topological Sorting aka Toposort or Topological Ordering of a directed graph is a linear ordering of its vertices .i.e. all the directed edges of the graph should go forward in the ordering.
You can consider an example of Semester courses where you have a lot a courses to study but there are few per-requisite course required before you attempt for advanced ones.
A topological ordering is possible if and only if the graph has no directed cycles, that is, if it is a directed acyclic graph (DAG).
The topological sort of the given above graph would produce the given below figure in which all the edges go forward.
Time Complexity : O(m+n)
where m: number of edges
n: number of vertices
Please post comments and suggestions.
Happy Coding !! :)
Implement Topological Sorting, for the given Directed Acyclic Graph (DAG)
![]() |
| Fig: Directed Acyclic Graph(DAG) |
Solution :
Note: Graph should be Directed Acyclic Graph (DAG)
Full Source Code : Link
What is Topological ordering or topological sort ?
Topological Sorting aka Toposort or Topological Ordering of a directed graph is a linear ordering of its vertices .i.e. all the directed edges of the graph should go forward in the ordering.
You can consider an example of Semester courses where you have a lot a courses to study but there are few per-requisite course required before you attempt for advanced ones.
A topological ordering is possible if and only if the graph has no directed cycles, that is, if it is a directed acyclic graph (DAG).
The topological sort of the given above graph would produce the given below figure in which all the edges go forward.
![]() |
| Fig: DAG , in which all edges go forward |
///======== TOPOLOGICAL SORT ========/////////
// to keep track of ordering
private int currentLabel;
int[] sortedArray;
public void topologicalSort()
{
currentLabel=vistedStatusList.size()-1;
sortedArray=new int[numVertices];
Set<Map.Entry<Integer, Boolean>> set=vistedStatusList.entrySet();
Iterator<Map.Entry<Integer, Boolean>> iterator=set.iterator();
while(iterator.hasNext())
{
Map.Entry<Integer,Boolean> node= iterator.next();
int key=node.getKey();
boolean isVisited=vistedStatusList.get(key);
if(!isVisited)
topologicalSortUtil(key); // Call DFS for a given node , if unvisited
}
// printing the topological sorted array
for(int i=0;i<sortedArray.length;i++)
{
if(sortedArray[i]!=0)
System.out.print(sortedArray[i]+"\t");
}
}
/**
* Procedure Similar to DFS, unwinds when deepest node is encountered
* @param vertex
*/
public void topologicalSortUtil(int vertex)
{
vistedStatusList.put(vertex,true);
List<Integer> list=adjList.get(vertex);
if(list!=null)
{
int size= list.size();
for(int i=0;i <size; ++i)
{
int adjNode=list.get(i);
boolean isVisited=vistedStatusList.get(adjNode);
if(!isVisited)
{
//System.out.println(adjNode + "\t");
topologicalSortUtil(adjNode);
}
}
}
/* for loop will end when the sink vertex is reached , that sink vertex is plucked and put in the array as per the currentLabel,
* which corresponds to its position in topological sort */
sortedArray[currentLabel]=vertex;
currentLabel--;
}
Time Complexity : O(m+n)
where m: number of edges
n: number of vertices
Please post comments and suggestions.
Happy Coding !! :)


No comments:
Post a Comment