Cod sursa(job #1776263)

Utilizator jason2013Andronache Riccardo jason2013 Data 11 octombrie 2016 08:50:24
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include "fstream"

using namespace std;

ifstream fin("disjoint.in");
ofstream fout("disjoint.out");

const int NMAX = 100005;

int N, M;
int parent[NMAX];

void merge(int x, int y)
{
    int rankX = 0, rankY = 0;
    int ancestorX = x, ancestorY = y;
    while(parent[ancestorX])
    {
        ancestorX = parent[ancestorX];
        rankX++;
    }

    while(parent[ancestorY])
    {
        ancestorY = parent[ancestorY];
        rankY++;
    }

    if(rankX < rankY)
    {
        parent[ancestorX] = ancestorY;
    }
    else
    {
        parent[ancestorY] = ancestorX;
    }

}

bool sameAncestor(int x, int y)
{
    int ancestorX = x, ancestorY = y;
    while(parent[ancestorX])
    {
        ancestorX = parent[ancestorX];
    }

    while(parent[ancestorY])
    {
        ancestorY = parent[ancestorY];
    }

    if(ancestorX == ancestorY) return true;
    else return false;
}
int main()
{
    int N, M;

    fin >> N >> M;

    for(int i = 1 ; i <= M ; i++)
    {
        int type, x, y;
        fin >> type >> x >> y;
        if(type == 1)
        {
            merge(x, y);
        }
        else
        {
            if(sameAncestor(x, y))
            {
                fout << "DA" << "\n";
            }
            else
            {
                fout << "NU" << "\n";
            }
        }
    }

    return 0;
}