Cod sursa(job #1558995)

Utilizator DiClauDan Claudiu DiClau Data 29 decembrie 2015 21:10:08
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include<stdio.h>
using namespace std;
const int N = 100005;
int h[N], v[N];
void init (int n)
{
    int i;
    for (i = 1; i <= n; i++)
    {
        h[i] = 1;
        v[i] = i;
    }
}
int gaseste (int x)
{
    int r = x;
    while (r != v[r])
        r = v[r];
    int aux;
    while (x != v[x])
    {
        aux = v[x];
        v[x] = r;
        x = aux;
    }
    return r;
}
void uneste (int x, int y)
{
    int radX = gaseste(x), radY = gaseste(y);
    if (radX != radY)
    {
        if (h[radX] > h[radY])
            v[radY] = radX;
        else
        {
            if (h[radX] <  h[radY])
                v[radX] = radY;
            else
            {
                v[radX] = radY;
                h[radY]++;
            }
        }
    }
}
int main ()
{
    FILE *in, *out;
    in = fopen ("disjoint.in", "r");
    out = fopen ("disjoint.out", "w");
    int n, m;
    fscanf (in, "%d%d", &n, &m);
    int i, cerinta, x, y;
    init(n);
    for (i = 1; i <= m; i++)
    {
        fscanf (in, "%d%d%d", &cerinta, &x, &y);
        if (cerinta == 1)
            uneste(x, y);
        else
        {
            if (gaseste(x) == gaseste(y))
                fprintf (out, "DA\n");
            else
                fprintf (out, "NU\n");
        }
    }
    return 0;
}