Cod sursa(job #699261)

Utilizator EstarDaian Dragos Estar Data 29 februarie 2012 18:28:40
Problema Paduri de multimi disjuncte Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream fi("disjoint.in");
ofstream fo("disjoint.out");

int sir[100001],rang[100001];

void combina(int x , int y){
    if(rang[sir[x]]>rang[sir[y]])
        sir[y]=sir[x];
    else if(rang[sir[x]]>rang[sir[y]])
        sir[x]=sir[y];
    else{
        rang[sir[x]]++;
        sir[sir[y]]=sir[x];
    }
}

void cauta(int x , int y){
    int i = x , j=y;
    while(sir[i]!=i)
    i=sir[i];
    while(sir[j]!=j)
    j=sir[j];
    if(i==j){
        fo<<"DA\n";
        i=x;
        while(sir[i]!=i){
            int aux=i;
            i=sir[i];
            sir[aux]=j;
        }
        i=y;
        while(sir[i]!=i){
            int aux=i;
            i=sir[i];
            sir[aux]=j;
        }
    }else fo<<"NU\n";
}

int main(){
    int n , m;
    fi>>n>>m;
    for(int i=1;i<=n;i++)
        sir[i]=i;
    for(int i=0;i<m;i++){
        int tip , x , y;
        fi>>tip>>x>>y;
        switch(tip){
            case 1:
            combina(x,y);
            continue;
            case 2:
            cauta(x,y);
        }
    }
}