Cod sursa(job #1542456)

Utilizator roxi22Roxi C. roxi22 Data 5 decembrie 2015 13:21:12
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <fstream>

using namespace std;
#define nmax 100001
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
int root[nmax],rang[nmax];
int n,m,cod,x,y;
/*
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;}}
*/
int find(int a){
    if(a!=root[a])
        root[a]=find(root[a]);
    return root[a];}
void unite(int a,int b){
    int ta=find(a);
    int tb=find(b);
    if(ta!=tb)
        //root[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()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++)
        {rang[i]=1;
        root[i]=i;}
    for(int i=1;i<=m;i++){
        fin>>cod;
        fin>>x>>y;
        if(cod==1)
            unite(x,y);
        else
            if(find(x)==find(y))
                fout<<"DA\n";
            else
                fout<<"NU\n";}
    return 0;
}