Cod sursa(job #2572872)

Utilizator Alex62493Manghiuc Alexandru Alex62493 Data 5 martie 2020 14:42:36
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda OJI 2020 Marime 1.09 kb
#include <cstdio>
#include <bits/stdc++.h>

using namespace std;

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

int n, m, rang[100001], tata[100001];

int Gasire(int x)
{
    int r=x, y;
    while (r!=tata[r])
        r=tata[r];
    while (tata[x]!=x)
    {
        y=tata[x];
        tata[x]=r;
        x=y;
    }
    return r;
}

void Unire(int x, int y)
{
    if (rang[x]>rang[y])
        tata[y]=x;
    else
        tata[x]=y;
    if (rang[x]==rang[y])
    {
        rang[y]++;
    }
}

int main()
{
    fscanf(fin, "%d%d", &n, &m);
    for (int i=1; i<=n; i++)
    {
        rang[i]=1;
        tata[i]=i;
    }
    for (int i=1; i<=m; i++)
    {
        int c, x, y;
        fscanf(fin, "%d%d%d", &c, &x, &y);
        if (c==1)
        {
            if (Gasire(x)!=Gasire(y))
                Unire(Gasire(x), Gasire(y));
        }
        else
        {
            if (Gasire(x)==Gasire(y))
                fprintf(fout, "DA\n");
            else
                fprintf(fout, "NU\n");
        }
    }
    return 0;
}