Cod sursa(job #1794826)

Utilizator martonsSoos Marton martons Data 1 noiembrie 2016 19:15:01
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <cstdio>

using namespace std;

struct elem{
    int t, nr;
};

int n, m;
elem v[100001];

int getR(int p){
    int p1 = p;

    while(v[p].t!=-1){
        p = v[p].t;
    }

    while(v[p1].t!=-1){
        int np = v[p1].t;
        v[p1].t = p;
        p1 = np;
    }

    return p;
}

int main()
{
    FILE *f = fopen("disjoint.in", "r");
    FILE *f1 = fopen("disjoint.out", "w");

    fscanf(f, "%d %d", &n, &m);

    for(int i=0;i<n;i++){
        v[i].t = -1;
        v[i].nr = 1;
    }

    for(int i=0;i<m;i++){
        int c, x, y;

        fscanf(f, "%d %d %d", &c, &x, &y);
        if(c == 1){
            int rx = getR(x);
            int ry = getR(y);

            if(v[rx].nr<v[ry].nr){
                v[rx].t = ry;
                v[ry].nr += v[rx].nr;
            }
            else{
                v[ry].t = rx;
                v[rx].nr += v[ry].nr;
            }
        }
        else if(c == 2){
            if(getR(x) == getR(y)){
                fprintf(f1, "DA\n");
            }
            else{
                fprintf(f1, "NU\n");
            }
        }
    }
    return 0;
}