Cod sursa(job #2522699)

Utilizator minut1Baies Cosmin minut1 Data 12 ianuarie 2020 21:09:53
Problema Paduri de multimi disjuncte Scor 10
Compilator java Status done
Runda Arhiva educationala Marime 1.59 kb
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Scanner;

public class Main {

  private static final String INPUT_FILE = "disjoint.in";
  private static final String OUTPUT_FILE = "disjoint.out";

  public static void main(String[] args) throws IOException {
    Scanner scanner = new Scanner(new FileInputStream(INPUT_FILE));
    PrintStream writer = new PrintStream(OUTPUT_FILE);

    int n = scanner.nextInt();
    int k = scanner.nextInt();

    UnionFind unionFind = new UnionFind(n);

    for (int i = 0; i < k; i++) {
      int type = scanner.nextInt();
      int a = scanner.nextInt();
      int b = scanner.nextInt();

      if (type == 1) {
        unionFind.union(a, b);
      } else if (type == 2) {
        writer.println(unionFind.find(a) == unionFind.find(b) ? "DA" : "NU");
      } else {
        throw new IllegalArgumentException("Type is " + type);
      }
    }
  }

  private static class UnionFind {
    private final int[] ids;

    UnionFind(int n) {
      ids = new int[n + 1];

      for (int i = 1; i <= n; i++) {
        ids[i] = i;
      }
    }

    /* Find the id of x, executing path compression */
    public int find(int x) {
      while (ids[x] != x) {
        int currId = ids[x];
        ids[x] = ids[ids[x]];
        x = currId;
      }

      return x;
    }

    /* Perform union on the sets of x and y */
    public void union(int x, int y) {
      int idX = find(x);
      int idY = find(y);

      if (idX != idY) {
        ids[idY] = idX;
      }
    }
  }
}