Cod sursa(job #1537393)

Utilizator BeilandArnoldArnold Beiland BeilandArnold Data 27 noiembrie 2015 10:46:15
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include <fstream>
#include <vector>
using namespace std;

vector<int> parent,rnk;

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

    return a;
}

void Union(int x, int y)
{
    int rx=Find(x), ry=Find(y);

    if(rx!=ry){
        if(rnk[rx]<rnk[ry]) parent[rx]=ry;
        else if(rnk[rx]>rnk[ry]) parent[ry]=rx;
        else{ parent[rx]=ry; rnk[ry]++; }
    }
}



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

    int n,m; fin>>n>>m;

    parent.resize(n+1); rnk.resize(n+1);
    for(int i=1;i<=n;++i){ parent[i]=i; rnk[i]=0; }


    for(int i=0;i<m;++i){
        int cod,a,b; fin>>cod>>a>>b;
        if(cod==1) Union(a,b);
        else if(Find(a)==Find(b)) fout<<"DA\n";
        else fout<<"NU\n";
    }

}