Cod sursa(job #920276)

Utilizator BeilandArnoldArnold Beiland BeilandArnold Data 20 martie 2013 10:04:18
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <fstream>
#include <vector>
using namespace std;

unsigned Find(unsigned x, vector<unsigned> &parent){
    unsigned a=x;
    while(parent[a]!=a) a=parent[a];
        while(parent[x]!=a){
        unsigned b=parent[x];
        parent[x]=a;
        x=b;
    }
    return a;
}

void Union(unsigned x, unsigned y,
           vector<unsigned> &parent, vector<unsigned> &rank){
    unsigned xroot=Find(x,parent);
    unsigned yroot=Find(y,parent);
    if(xroot!=yroot){
        if(rank[xroot]>rank[yroot]) parent[yroot]=xroot;
        else if(rank[xroot]<rank[yroot]) parent[xroot]=yroot;
        else{
            parent[xroot]=yroot;
            rank[yroot]++;
        }
    }
}

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

    unsigned N, M;
    fin>>N>>M;
    vector<unsigned> parent(N),rank(N,0);
    for(unsigned i=0;i<N;++i) parent[i]=i;

    while(M--){
        char t; unsigned x,y;
        fin>>t>>x>>y;
        x--; y--;
        if(t=='1') Union(x,y,parent,rank);
        if(t=='2'){
            if(Find(x,parent)==Find(y,parent)) fout<<"DA\n";
            else fout<<"NU\n";
        }
    }
}