import
java.util.ArrayList;
class
Solution {
void
dfs(
int
i,
int
curr,
ArrayList<ArrayList<Integer> > adj,
ArrayList<ArrayList<Integer> > dis,
int
[] vis)
{
vis[curr] =
1
;
dis.get(i).set(curr,
1
);
for
(
int
x : adj.get(curr)) {
if
(vis[x] ==
0
) {
dfs(i, x, adj, dis, vis);
}
}
}
ArrayList<ArrayList<Integer> >
transitiveClosure(
int
N,
int
[][] graph)
{
ArrayList<ArrayList<Integer> > adj
=
new
ArrayList<>();
for
(
int
i =
0
; i < N; i++) {
adj.add(
new
ArrayList<>());
for
(
int
j =
0
; j < N; j++) {
if
(graph[i][j] ==
1
&& i != j) {
adj.get(i).add(j);
}
}
}
ArrayList<ArrayList<Integer> > dis
=
new
ArrayList<>();
for
(
int
i =
0
; i < N; i++) {
dis.add(
new
ArrayList<>());
for
(
int
j =
0
; j < N; j++) {
dis.get(i).add(
0
);
}
}
for
(
int
i =
0
; i < N; i++) {
int
[] vis =
new
int
[N];
dfs(i, i, adj, dis, vis);
}
return
dis;
}
}