Cod sursa(job #1539114)

Utilizator Vlad_317Vlad Panait Vlad_317 Data 30 noiembrie 2015 11:53:13
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <stdio.h>

using namespace std;

const int MAX = 100000;

int parinte[MAX + 1];
int n;

void init()
{
    for(int i = 1; i <= n; i++)
        parinte[i] = i;
}

int find(int u)
{
    int ans = u;
    while(parinte[ans] != ans)
    {
        ans = parinte[ans];
    }
    while(parinte[u] != ans)
    {
        int tmp = parinte[u];
        parinte[u] = ans;
        u = tmp;
    }
    return ans;
}

void join(int u, int v)
{
    u = find(u);
    v = find(v);
    parinte[u] = v;
}

bool querry(int u, int v)
{
    return find(u) == find(v);
}

int main()
{
    FILE *fin, *fout;

    fin = fopen("disjoint.in", "r");
    fout = fopen("disjoint.out", "w");

    int m;

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

    init();

    for(int i = 1; i <= m; i++)
    {
        int op, a, b;
        fscanf(fin, "%d %d %d", &op, &a, &b);
        if(op == 1)
            join(a, b);
        else
        {
            if(querry(a, b) == true)
                fprintf(fout, "DA\n");
            else
                fprintf(fout, "NU\n");
        }
    }

    return 0;
}