Cod sursa(job #485581)

Utilizator andra23Laura Draghici andra23 Data 18 septembrie 2010 20:51:59
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include<fstream>
#define maxn 100005

using namespace std;

int t[maxn], rg[maxn], n;

void makeset(){
    for (int i = 1; i <= n; i++){
        t[i] = i;
        rg[i] = 0;
    }    
}

int find(int x){
    if (x == t[x])
        return x;
    else {
        t[x] = find(t[x]);
        return t[x];    
    }    
}

int find2(int x){
    int r = x;
    while (t[r] != r)
        r = t[r];
    int y;
    while (x != t[x]){
        y = t[x];
        t[x] = r;
        x = y;    
    }    
}

void unionn(int x, int y){
    x = find2(x);
    y = find2(y);
    if (rg[x] > rg[y])
        t[y] = x;
    else 
        if (rg[y] > rg[x])
            t[x] = y;
        else 
            if (x != y){
                t[y] = x;
                rg[x]++;                 
            }
}

int main(){
    ifstream f("disjoint.in");
    ofstream g("disjoint.out");
    int m, i, j, c, x, y;
    f>>n>>m;
    
    makeset();
    
    for (i = 1; i <= m; i++){
        f>>c>>x>>y;
        if (c == 1)
            unionn(x, y);
        else {
            x = find2(x);
            y = find2(y);
            if (x == y)
                g<<"DA"<<'\n';
            else 
                g<<"NU"<<'\n';    
        }    
    }
    
    return 0;   
}