Cod sursa(job #1428036)

Utilizator dorumusuroiFMI - Doru Musuroi dorumusuroi Data 3 mai 2015 15:55:19
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <iostream>
#include <fstream>
using namespace std;

//pentru a tine seturile ne folosim de arbori
//pastram arborii prin vector de tati
//let's do it!

const int NMAX = 100020;
const char iname[] = "disjoint.in";
const char oname[] = "disjoint.out";

int tata[NMAX], rg[NMAX];

void MakeSet(int n)
{
    for(int i = 0 ; i < n; i++)
    {
        tata[i] = i;
        rg[i] = 0;
    }
}

int find(int x)
{
    //ma deplasez in sus pe arbore pana dau de un nod care e propriul tata
    int R, y;
    for(R = x; tata[R] != R; R = tata[R]);

    //fac compresie de drumuri
    while(tata[x] != x)
    {
        y = tata[x];
        tata[x] = R;
        x = y;
    }
    return R;
}

void unite(int x, int y)
{
    if(x == y)
        return;
    if(rg[x] > rg[y])
        tata[y] = x;
    else
        tata[x] = y;
    if(rg[x] == rg[y])
        rg[y]++;
}
void solve()
{
    ifstream f(iname);
    ofstream g(oname);
    int n, m;
    f>>n>>m;
    MakeSet(n);
    for(int i = 0 ; i < m; i++)
    {
        int c,x,y;
        f>>c>>x>>y;
        if(c == 1)
            unite(find(x), find(y));
        else
            if(find(x) != find(y))
                g<<"NU\n";
            else
                g<<"DA\n";
    }
    f.close();
    g.close();
}
int main()
{
    solve();
    return 0;
}