package com.data.struct;
import java.util.Random;
public class ConnectedComponent {
  private Node[] list;
  
  public ConnectedComponent(int v,int e){
    list=new Node[v];
    for(int i=0;i<v;i++){
      Node node=new Node();
      node.id=i;
      list[i]=node;
    }
    for(int i=0;i<e;i++){
      int v1=new Random().nextInt(v);
      int v2=new Random().nextInt(v);
      if(v1==v2){
        continue;
      }
      while(true){
        Node node=list[v1];
        boolean already=false;
        while(node.next!=null){
          if(node.next.id==v2){
            already=true;
            break;
          }
          node=node.next;
        }
        if(already==true){
          break;
        }
        Node ex=new Node();
        ex.id=v2;
        node.next=ex;
        break;
      }
    }
    for(int i=0;i<list.length;i++){
      makeSet(list[i]);
      
    }
    for(int i=0;i<list.length;i++){
      Node node=list[i];
      Node w=node;
      while(node.next!=null){
        if(findSet(list[w.id])!=findSet(list[node.next.id])){
          union(list[w.id],list[node.next.id]);
        }
        node=node.next;
      }
    }
    
  }
  
  public void makeSet(Node x){
    x.parent=x;
    x.rank=0;
  }
  public void union(Node x,Node y){
     link(findSet(x),findSet(y));
  }
  private void link(Node x,Node y){
    if(x.rank>y.rank){
      y.parent=x;
    }else{
      x.parent=y;
      if(x.rank==y.rank){
        y.rank++;
      }
    }
    
  }
  public Node findSet(Node x){
    if(x.parent!=x){
      x.parent=findSet(x.parent);
    }
    return x.parent;
  }
  
  public boolean sameComponent(Node u,Node v){
    if(findSet(u)==findSet(v)){
      return true;
    }else {
      return false;
    }
  }
  public static class Node{
    private int id;
    private Node next;
    private Node parent;
    private int rank;
    
    
  }
  public static void main(String[] args) {
    ConnectedComponent c=new ConnectedComponent(10,5);
    System.out.println(c.sameComponent(c.list[0], c.list[1]));
  }
}