Cod sursa(job #3267079)

Utilizator EnnBruhEne Andrei EnnBruh Data 11 ianuarie 2025 09:22:56
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <bits/stdc++.h>

using namespace std;

#define inFile "disjoint.in"
#define outFile "disjoint.out"

FILE *in  = fopen(inFile, "r");
FILE *out = fopen(outFile, "w");

#define maxSize 1000002
#define inf 0x3f3f3f3f

int comParent[maxSize], comSize[maxSize];
int findParent(int node) {
    while (node != comParent[node]) node = comParent[node];
    return node;
}

bool isSameComp(int nodeA, int nodeB) {
    return findParent( nodeA ) == findParent( nodeB );
}

bool connectNodes(int nodeA, int nodeB) {
    nodeA = findParent( nodeA );
    nodeB = findParent( nodeB );

    if (comSize[nodeA] < comSize[nodeB]) swap(nodeA, nodeB);
    comParent[nodeB] = nodeA; comSize[nodeA] += comSize[nodeB];
}

int main( ) {
    int numNodes, numEdges; fscanf(in, "%d %d", &numNodes, &numEdges);
    for (int i = 1; i <= numNodes; ++i) {
        comSize[i] = 1;
        comParent[i] = i;
    }


    for (int i = 0; i < numEdges; ++i) {
        int task; fscanf(in, "%d", &task);
        int nodeA, nodeB; fscanf(in, "%d %d", &nodeA, &nodeB);

        switch ( task ) {
            case 1: connectNodes(nodeA, nodeB); break;
            case 2:
                    if (isSameComp(nodeA, nodeB)) fprintf(out, "DA\n");
                    else fprintf(out, "NU\n");
                    break;
        }
    }

    return 0;
}