Cod sursa(job #2084317)

Utilizator vladcoroian2001Vlad Coroian vladcoroian2001 Data 8 decembrie 2017 22:22:38
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <fstream>

using namespace std;
ifstream fi("disjoint.in");
ofstream fo("disjoint.out");
const int nmax=1e5+5;
int n,m,P[nmax],cod,x,y;
int radacina(int v)
{
    if(P[v]<0)
        return v;
    else
        return radacina(P[v]);
}

void reuniune(int x,int y)
{
    if(-P[x]<=-P[y])
    {
        P[x]+=P[y];
        P[y]=x;
    }
    else
    {
        P[y]+=P[x];
        P[x]=y;
    }
}

int main()
{
    fi>>n>>m;
    for(int i=1;i<=n;i++)
        P[i]=-1;
    for(int i=1;i<=m;i++)
    {
        fi>>cod>>x>>y;
        if(cod==1)
        {
            if(P[x]>0)
                P[x]=radacina(x);
            if(P[y]>0)
                P[y]=radacina(y);
            reuniune(x,y);
        }
        else
        {
            if(P[x]>0)
                P[x]=radacina(x);
            if(P[y]>0)
                P[y]=radacina(y);
            if((P[x]==P[y] && P[x]>0) || (P[x]<0 && x==P[y]) || (P[y]<0 && y==P[x]))
                fo<<"DA\n";
            else
                fo<<"NU\n";
        }
    }
    fi.close();
    fo.close();
    return 0;
}