Cod sursa(job #796352)

Utilizator cristianalex81Cristian Alexandru cristianalex81 Data 11 octombrie 2012 09:55:31
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <iostream>
#include <fstream>
#define dim 100005

using namespace std;

int n,m;
int arb[dim];
int adm[dim];

void red(int root, int p)
{
    int next;
    while(arb[p]!=root)
    {
        next = arb[p];
        arb[p]=root;
        p = next;
    }
}

bool req(int p1, int p2)
{
    int root,poz;

    poz=p2;
    while(arb[poz]!=poz)
        poz=arb[poz];
    root = poz;
    red(root, p2);

    poz=p1;
    while(arb[poz]!=poz)
        poz=arb[poz];
    root = poz;
    red(root, p1);

    if (arb[p1]==arb[p2])
        return true;
    return false;
}

void lnk(int p1, int p2)
{
    if (adm[p1]== adm[p2])
    {
        arb[p2]=p1;
        adm[p1]++;
        return;
    }
    if (adm[p1]>adm[p2])
        arb[p2]=p1;//link p2 to p1
    else
        arb[p1]=p2;//link p1 to p2

}

int main()
{
    ifstream cin("disjoint.in");
    ofstream cout("disjoint.out");
    int s,p1,p2;
    cin>>n>>m;
    //ini
    for (int i=0;i<n;i++)
    {
        arb[i]=i;
        adm[i]=1;
    }
    for (int i=0;i<m;i++)
    {
        cin>>s>>p1>>p2;
        if (s==1)
            lnk(p1,p2);
        else
        {
            if (req(p1,p2))
                cout<<"DA"<<endl;
            else
                cout<<"NU"<<endl;
        }
    }
    return 0;
}