Cod sursa(job #1298654)

Utilizator Vele_GeorgeVele George Vele_George Data 23 decembrie 2014 00:21:17
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("disjoint.in");
ofstream g("disjoint.out");
int n,m,act,x,y;
vector<int> T,rang;

int find(int x){
    int y=x;
    while (T[x]!=x){

        x=T[x]; // T[x] == tatal lui x
    }
    T[y]=x;//setam drum direct de la x la root
    return x;
}

void join(int x, int y){

    x=find(x);
    y=find(y);
    if (rang[x]<rang[y]) T[x]=y;
    if (rang[x]>rang[y]) T[y]=x;
    if (rang[x]==rang[y]){
        T[x]=y;
        rang[y]++;
    }


}







int main()
{
    f>>n>>m;

    for(int i=0; i<=n; i++){
        T.push_back(i);
        rang.push_back(0);
    }


    for(int i=0; i<m; i++){

        f>>act>>x>>y;

        if (act==1) join(x,y);
        else if (find(x)==find(y)) g<<"DA\n";
        else g<<"NU\n";
    }
    f.close();
    g.close();
    return 0;
}