All Topological Sorts of a Directed Acyclic Graph - GeeksforGeeks
Topological sorting for Directed Acyclic Graph (DAG) is a linear ordering of vertices such that for every directed edge uv, vertex u comes before v in the ordering. Topological Sorting for a graph is not possible if the graph is not a DAG.
Given a DAG, print all topological sorts of the graph.
Read full article from All Topological Sorts of a Directed Acyclic Graph - GeeksforGeeks
Topological sorting for Directed Acyclic Graph (DAG) is a linear ordering of vertices such that for every directed edge uv, vertex u comes before v in the ordering. Topological Sorting for a graph is not possible if the graph is not a DAG.
Given a DAG, print all topological sorts of the graph.
- Initialize all vertices as unvisited.
- Now choose vertex which is unvisited and has zero indegree and decrease indegree of all those vertices by 1 (corresponding to removing edges) now add this vertex to result and call the recursive function again and backtrack.
- After returning from function reset values of visited, result and indegree for enumeration of other possibilities.
void
Graph::alltopologicalSortUtil(vector<
int
>& res,
bool
visited[])
{
// To indicate whether all topological are found
// or not
bool
flag =
false
;
for
(
int
i = 0; i < V; i++)
{
// If indegree is 0 and not yet visited then
// only choose that vertex
if
(indegree[i] == 0 && !visited[i])
{
// reducing indegree of adjacent vertices
list<
int
>:: iterator j;
for
(j = adj[i].begin(); j != adj[i].end(); j++)
indegree[*j]--;
// including in result
res.push_back(i);
visited[i] =
true
;
alltopologicalSortUtil(res, visited);
// resetting visited, res and indegree for
// backtracking
visited[i] =
false
;
res.erase(res.end() - 1);
for
(j = adj[i].begin(); j != adj[i].end(); j++)
indegree[*j]++;
flag =
true
;
}
}
// We reach here if all vertices are visited.
// So we print the solution here
if
(!flag)
{
for
(
int
i = 0; i < res.size(); i++)
cout << res[i] <<
" "
;
cout << endl;
}
}
// The function does all Topological Sort.
// It uses recursive alltopologicalSortUtil()
void
Graph::alltopologicalSort()
{
// Mark all the vertices as not visited
bool
*visited =
new
bool
[V];
for
(
int
i = 0; i < V; i++)
visited[i] =
false
;
vector<
int
> res;
alltopologicalSortUtil(res, visited);
}