Cod sursa(job #699930)

Utilizator EstarDaian Dragos Estar Data 29 februarie 2012 22:01:21
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>
#include <vector>

using namespace std;

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

int sir[100001],rang[100001],k=0;

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) {
    k++;
    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";
    else fo<<"NU\n";
    int go;
    go=i;
    i=x;
    while(sir[i]!=go) {
        int aux=i;
        i=sir[i];
        sir[aux]=go;
    }
    go=j;
    i=y;
    while(sir[i]!=go) {
        int aux=i;
        i=sir[i];
        sir[aux]=go;
    }


}

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);
        }
    }
}