class Solution
{
public int detectCycle(int V, ArrayList<ArrayList<Integer>> adj)
{
int[] parent=new int[V];
int[] rank=new int[V];
for(int i=0;i<V;i++){
parent[i]=i;
rank[i]=1;
}
for(int i=0;i<V;i++){
for(int j:adj.get(i)){
if(i<j&&union(i,j,parent,rank,V)){
return 1;
}
}
}
return 0;
}
public boolean union(int i,int j,int[] parent,int[] rank,int n){
i=find(i,parent);
j=find(j,parent);
if(i==j) return true;
if(rank[i]>rank[j]){
parent[j]=i;
}
else if(rank[j]>rank[i]){
parent[i]=j;
}
else{
parent[j]=i;
rank[i]+=1;
}
return false;
}
public int find(int v,int[] parent){
if(v==parent[v]) return v;
return parent[v]=find(parent[v],parent);
}
}