Cod sursa(job #1789733)

Utilizator sadpolkgigi becali smecher sadpolk Data 27 octombrie 2016 14:57:14
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <fstream>

using namespace std;
ifstream in("disjoint.in");
ofstream out("disjoint.out");
int t[100005],h[100005];
int findset(int u)
{
    while(t[u]!=u)
    {
        u=t[u];
    }
    return u;
}
void unionset(int u,int v)
{
    int tu,tv;
    tu=findset(u);
    tv=findset(v);
    if(h[tu]==h[tv])
    {
     h[tu]++;
     t[tv]=t[tu];
    }
    else
        if(h[tu]>=h[tv])
    {
        t[tv]=t[tu];
    }
            else
            {
                t[tu]=t[tv];
            }
}
int main()
{
    int i,n,m,op,r,d;
    in>>n>>m;
    for(i=1;i<=n;i++)
    {
        t[i]=i;
        h[i]=1;
    }
    for(i=1;i<=m;i++)
    {
        in>>op>>r>>d;
        if(op==1)
        {
            if(findset(r)!=findset(d))
                {
                    unionset(r,d);
                }
        }
            else{
                    if(findset(r)==findset(d))
                        out<<"DA"<<"\n";
                        else
                            out<<"NU"<<"\n";
            }
    }
    return 0;
}