Cod sursa(job #2335502)

Utilizator david.sachelarieDavid Sachelarie david.sachelarie Data 4 februarie 2019 10:55:06
Problema Paduri de multimi disjuncte Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <iostream>
#include <fstream>
int sef[100000],temp[100000];
using namespace std;

void calcDaBoss(int n){
    int i;
    for(i=0;i<n;i++)
        sef[i]=i;
}
void unionMul(int x,int y){
    while(sef[x]!=x)
        x=sef[x];
    while(sef[y]!=y)
        y=sef[y];
    sef[x]=sef[y];
}
int findus(int x,int y){
    int i=0,j;
    while(sef[x]!=x){
        temp[i]=x;
        x=sef[x];
        i++;
    }
    for(j=0;j<i;j++){
        sef[temp[j]]=x;
    }
    i=0;
    while(sef[y]!=y){
        temp[i]=y;
        y=sef[y];
        i++;
    }
    for(j=0;j<i;j++){
        sef[temp[j]]=y;
    }
    if(sef[x]==sef[y])
        return 1;
    else
        return 0;
}
int main()
{
    ifstream fin("disjoint.in");
    ofstream fout("disjoint.out");
    int n,m,code,x,y,val,i;
    fin>>n>>m;
    calcDaBoss(n);
    for(i=0;i<m;i++){
        fin>>code>>x>>y;
        if(code==1){
            unionMul(x,y);
        }
        else{
            val=findus(x,y);
            if(val==0)
                fout<<"NU"<<endl;
            else
                fout<<"DA"<<endl;
        }
    }
    fin.close();
    fout.close();
    return 0;
}