Cod sursa(job #2582498)

Utilizator AplayLazar Laurentiu Aplay Data 16 martie 2020 20:21:45
Problema Paduri de multimi disjuncte Scor 40
Compilator java Status done
Runda Arhiva educationala Marime 2.43 kb
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class Main {

    private static final int QUERY_UNION = 1;
    private static final int QUERY_ARE_SAME_SET = 2;

    private static final String QUERY_ARE_SAME_SET_YES = "DA";
    private static final String QUERY_ARE_SAME_SET_NO = "NU";

    public static final void main(final String[] argv) throws IOException {
        final BufferedReader in = new BufferedReader(new FileReader("disjoint.in"));
        final BufferedWriter out = new BufferedWriter(new FileWriter("disjoint.out"));

        final int[] nAndM = parseLine(in.readLine());
        final int N = nAndM[0];
        final int M = nAndM[1];

        final int[] sets = new int[1 + N];
        final int[] rank = new int[1 + N];
        for (int pos = 1; pos <= N; ++pos) {
            sets[pos] = pos;
            rank[pos] = 1;
        }

        for (int query = 0; query < M; ++query) {
            final int[] queryData = parseLine(in.readLine());
            final int qType = queryData[0];
            final int x = queryData[1];
            final int y = queryData[2];

            switch (qType) {
                case QUERY_UNION: {
                    if (rank[y] < rank[x]) {
                        sets[y] = sets[x];
                    } else {
                        sets[x] = sets[y];
                    }
                    rank[x] += rank[y];
                    rank[y] = rank[x];
                    break;
                } 
                case QUERY_ARE_SAME_SET: {
                    out.write((setOf(x, sets) == setOf(y, sets) ? QUERY_ARE_SAME_SET_YES : QUERY_ARE_SAME_SET_NO) + "\n");
                    break;
                }
            }
        }

        in.close();
        out.flush();
        out.close();
    }

    private static final int setOf(final int of, final int[] sets) {
        int x = of;
        int setOfX = sets[of];
        while (x != setOfX) {
            sets[x] = setOfX;
            x = setOfX;
            setOfX = sets[x];
        }
        return setOfX;
    }

    private static final int[] parseLine(final String line) {
        final String[] words = line.split(" ");
        final int[] intWords = new int[words.length];
        for (int wordPos = 0; wordPos < words.length; ++wordPos) {
            intWords[wordPos] = Integer.parseInt(words[wordPos]);
        }
        return intWords;
    }

}