Cod sursa(job #1781956)

Utilizator KronSabau Valeriu Kron Data 17 octombrie 2016 17:38:44
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include <iostream>
#include <fstream>
using namespace std;

ifstream f("disjoint.in");
ofstream g("disjoint.out");
int parent[100010],Rank[100010],n,m;

int Find(int x)
{
    while(parent[x]!=x)
        parent[x]=Find(x);

    return parent[x];
}

void Union(int x,int y)
{
    int xroot=Find(x);
    int yroot=Find(y);
    if(Rank[x]==Rank[y])
    {
        parent[yroot]=xroot;
        Rank[x]++;
    }

    if(Rank[x]<Rank[y]) parent[xroot]=yroot;
    else parent[yroot]=xroot;
}

int main()
{
    int val,x,y;
    f >> n >> m;

    for(int i=1;i<=n;i++)
        parent[i]=i;

    for(int i=0;i<m;i++)
    {
        f>> val >> x >> y;
        if(val==1)
        {

            Union(x,y);

        }else {

            if(parent[x]==parent[y])
                g << "DA\n";

            else g << "NU\n";

        }

    }
    return 0;
}