Cod sursa(job #1795698)

Utilizator mihai.alphamihai craciun mihai.alpha Data 2 noiembrie 2016 19:56:47
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda cerculdeinfo-lectia5-paduri.heap.aib Marime 1.16 kb
#include <stdio.h>
int tati[100002], marime[100002];
inline int find1(int x)  {
    int i;
    i = x;
    while(i != tati[i])
        i = tati[i];
    return i;
}
inline int union1(int x, int y)  {
    int tatix, taty;
    tatix = find1(x);
    taty = find1(y);
    if(tatix == taty)
        return 0;
    if(marime[tatix] == marime[taty])  {
        marime[tatix]++;
    }
    if(marime[tatix] > marime[taty])
        tati[taty] = tatix;
    else
        tati[tatix] = taty;
    return 0;
}

int main()  {
    FILE *fin, *fout;
    fin = fopen("disjoint.in", "r");
    fout = fopen("disjoint.out", "w");
    int n, m;
    fscanf(fin, "%d%d", &n, &m);
    int i;
    int op;
    for(i = 1;i <= n;i++)  {
        tati[i] = i;
        marime[i] = 1;
    }
    int x, y;
    for(i = 0;i < m;i++)  {
        fscanf(fin, "%d", &op);
        fscanf(fin, "%d%d", &x, &y);
      //  printf("%d %d %d\n", op, x, y);
        if(op == 1)  {
            union1(x, y);
        }
        else  {
            if(find1(x) == find1(y))
                fprintf(fout, "DA\n");
            if(find1(x) != find1(y)) fprintf(fout, "NU\n");
        }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}