Cod sursa(job #1999511)

Utilizator daviddragostinDavid Dragostin daviddragostin Data 11 iulie 2017 13:00:39
Problema Paduri de multimi disjuncte Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <fstream>

using namespace std;
int p[100000];
int h[100000];
int findset(int x)
{
    while(p[x]!=x)
        x=p[x];
    return x;
}
int fd(int x,int y)
{
    return (findset(x)==findset(y));
}
int unionset(int x,int y)
{
    if(h[x]==h[y])
    {
        p[y]=x;
        h[x]++;
    }
    else if(h[x]>h[y])
    {
        p[y]=x;
        h[x]++;
    }
    else
    {
        p[x]=y;
        h[y]++;
    }
}
ifstream cin("disjoint.in");
ofstream cout("disjoint.out");
int main()
{
    int n,m,u,v,i,tu,tv;
    cin>>n>>m;
    for(i=1;i<=n;i++)
    {
        p[i]=i;
        h[i]=1;
    }
    int nr;
    for(i=1;i<=m;i++)
    {
        cin>>nr>>u>>v;
        if(nr==1){
        tu=findset(u);
        tv=findset(v);
        if(tu!=tv)
            unionset(tu,tv);
        }
        if(nr==2)
        {
            if(fd(u,v)>0)
                cout<<"DA"<<endl;
            else
                cout<<"NU"<<endl;
        }
    }
    return 0;
}