Cod sursa(job #2237343)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 1 septembrie 2018 17:12:16
Problema Paduri de multimi disjuncte Scor 40
Compilator java Status done
Runda Arhiva educationala Marime 2.47 kb
import static java.util.Objects.requireNonNull;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Scanner;
import java.util.StringTokenizer;

public final class Main {
  public static final String IN_FILE = "disjoint.in";
  public static final String OUT_FILE = "disjoint.out";

  public static final class FastScanner implements AutoCloseable {
    private final BufferedReader reader;
    private StringTokenizer tokenizer;

    public FastScanner(final InputStream stream) {
      reader = new BufferedReader(new InputStreamReader(stream));
    }

    private String next() throws IOException {
      while (tokenizer == null || !tokenizer.hasMoreTokens()) {
        final String line = requireNonNull(reader.readLine());
        tokenizer = new StringTokenizer(line);
      }
      return tokenizer.nextToken();
    }

    public int nextInt() throws IOException {
      return Integer.parseInt(next());
    }

    @Override
    public void close() throws IOException {
      reader.close();
    }
  }

  public static final class DisjointSets {
    private static final int NIL = -1;

    private final int size;
    private final int[] parent;

    public DisjointSets(final int size) {
      this.size = size;
      this.parent = new int[size];
      Arrays.fill(this.parent, NIL);
    }

    public int find(final int x) {
      if (parent[x] == NIL) {
        return x;
      }
      parent[x] = find(parent[x]);
      return parent[x];
    }

    public boolean merge(final int x, final int y) {
      final int rx = find(x);
      final int ry = find(y);
      if (rx == ry) {
        return false;
      }
      parent[ry] = rx;
      return true;
    }
  }

  public static void main(final String[] args) throws IOException {
    try (final Scanner scanner = new Scanner(new FileInputStream(IN_FILE));
        final PrintWriter writer = new PrintWriter(OUT_FILE)) {
      final int n = scanner.nextInt();
      final int m = scanner.nextInt();
      final DisjointSets sets = new DisjointSets(n);
      for (int i = 1; i <= m; i++) {
        final int type = scanner.nextInt();
        final int x = scanner.nextInt() - 1;
        final int y = scanner.nextInt() - 1;
        if (type == 1) {
          sets.merge(x, y);
        } else {
          writer.println(sets.find(x) == sets.find(y) ? "DA" : "NU");
        }
      }
    }
  }
}