Cod sursa(job #1542463)

Utilizator vLaDy198Bocean Vlad vLaDy198 Data 5 decembrie 2015 13:26:15
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include <iostream>
#include<fstream>
using namespace std;
ifstream fi("disjoint.in");
ofstream fo("disjoint.out");
int root[100002],rang[100002];
int find(int a)
{
    int t,i,x;
    for(t=a;t!=root[t];t=root[t])
        for(i=a;i!=t;)
            {x=root[i];
            root[i]=t;
            i=x;
            }
    return i;
}
void unite(int a,int b)
{
    int ta=find(a),tb=find(b);
    if(ta!=tb)
     if(rang[ta]<rang[tb])
            root[ta]=tb;
        else if(rang[ta]>rang[tb])
        root[tb]=ta;
            else{root[ta]=tb;rang[tb]++;}

}

int main()
{int n,m,a,b,ob;
fi>>n>>m;
for(int i=1;i<=m;i++)
    {
        fi>>ob;
        if(ob==1)
        {
            fi>>a>>b;
            unite(a,b);
        }
        if(ob==2)
        {
            fi>>a>>b;
            if(find(a)==find(b))
                fo<<"DA"<<'\n';
            else fo<<"NU"<<'\n';
        }
    }
    return 0;
}