Cod sursa(job #2582508)

Utilizator AplayLazar Laurentiu Aplay Data 16 martie 2020 20:31:41
Problema Paduri de multimi disjuncte Scor 40
Compilator java Status done
Runda Arhiva educationala Marime 2.77 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: {
                    final int setOfX = setOf(x, sets);
                    final int setOfY = setOf(y, sets);
                    
                    if (rank[setOfX] < rank[setOfY]) {
                        sets[setOfX] = setOfY;
                    } else {
                        sets[setOfY] = setOfX;
                    }

                    if (rank[setOfX] == rank[setOfY]) {
                        ++rank[setOfX];
                        ++rank[setOfY];
                    }
                    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) {
            x = setOfX;
            setOfX = sets[x];
        }
        x = of;
        while (x != setOfX) {
            final int nextX = sets[x];
            sets[x] = setOfX;
            x = nextX;
        }
        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;
    }

}