import
java.util.ArrayList;
import
java.util.Collections;
import
java.util.HashSet;
public
class
Dfs1 {
static
ArrayList<HashSet<Integer> >
make_graph(
int
numTasks,
int
[][] prerequisites)
{
ArrayList<HashSet<Integer> > graph
=
new
ArrayList(numTasks);
for
(
int
i =
0
; i < numTasks; i++)
graph.add(
new
HashSet<Integer>());
for
(
int
[] pre : prerequisites)
graph.get(pre[
1
]).add(pre[
0
]);
return
graph;
}
static
boolean
dfs(ArrayList<HashSet<Integer> > graph,
int
node,
boolean
[] onpath,
boolean
[] visited,
ArrayList<Integer> toposort)
{
if
(visited[node])
return
false
;
onpath[node] = visited[node] =
true
;
for
(
int
neigh : graph.get(node))
if
(onpath[neigh]
|| dfs(graph, neigh, onpath, visited,
toposort))
return
true
;
toposort.add(node);
return
onpath[node] =
false
;
}
static
ArrayList<Integer>
findOrder(
int
numTasks,
int
[][] prerequisites)
{
ArrayList<HashSet<Integer> > graph
= make_graph(numTasks, prerequisites);
ArrayList<Integer> toposort
=
new
ArrayList<Integer>();
boolean
[] onpath =
new
boolean
[numTasks];
boolean
[] visited =
new
boolean
[numTasks];
for
(
int
i =
0
; i < numTasks; i++)
if
(!visited[i]
&& dfs(graph, i, onpath, visited, toposort))
return
new
ArrayList<Integer>();
Collections.reverse(toposort);
return
toposort;
}
public
static
void
main(String[] args)
{
int
numTasks =
4
;
int
[][] prerequisites
= { {
1
,
0
}, {
2
,
1
}, {
3
,
2
} };
ArrayList<Integer> v
= findOrder(numTasks, prerequisites);
for
(
int
i =
0
; i < v.size(); i++) {
System.out.print(v.get(i) +
" "
);
}
}
}