Cod sursa(job #1801843)

Utilizator Mircea_DonciuDonciu Mircea Mircea_Donciu Data 9 noiembrie 2016 17:36:55
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.78 kb
#include <fstream>

using namespace std;
int n,m,i,x,y,c,v[100020],w[100020];
int find(int x)
{
    int q,y;
    for (q=x; v[q]!=q; q=v[q]);
    while(v[x]!=x)
    {
        y=v[x];
        v[x]=q;
        x=y;
    }
    return q;
}
void unite(int x, int y)
{
    if (w[x]>w[y])
    v[y]=x;
    else v[x]=y;
    if(w[x]==w[y]) w[y]++;
}
int main()
{
    ifstream f("disjoint.in");
    ofstream g("disjoint.out");
    f>>n>>m;
    for (i=1; i<=n; i++)
    {
        v[i]=i;
        w[i]=1;
    }
    for (i=1; i<=m; i++)
    {
        f>>c>>x>>y;
        if(c==2)
        {
            if(find(x)==find(y)) g<<"DA\n";
                else g<<"NU\n";
        }
        else
        {
            unite(find(x), find(y));
        }
    }
    return 0;
}