Cod sursa(job #1540804)

Utilizator Andreiii500Andrei Puiu Andreiii500 Data 3 decembrie 2015 11:52:15
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include<iostream>
#include<fstream>
using namespace std;

#define dim 100001

ifstream in("disjoint.in");
ofstream out("disjoint.out");

struct nod
{
    nod *next;
    int val;
};

nod *v[dim];
int tata[dim];
int n,m;

void init()
{
    int i;

    for(i=1; i<=n; ++i)
    {
        tata[i] = i;
        v[i] = new nod;
        v[i]->val = i;
        v[i]->next = NULL;
    }
}

void join(int a, int b) // introduc lista lui b in lista lui a
{
    nod *j, *temp;

    j = v[b];

    while(j != NULL)
    {
        temp = new nod;

        temp->next = v[a];
        temp->val = j->val;

        v[a] = temp;
        tata[j->val] = a;

        j = j->next;
    }
    v[b] = NULL; /// Curat ultimul element
}

void afis()
{
    int i;
    nod *p;

    for(i=1; i<=n; ++i)
    {
        p = v[i];
        cout<<"Arbore "<<i<<" _"<<tata[i]<<"_  ";
        while(p)
        {
            cout<<p->val<<" ";
            p = p->next;
        }
        cout<<"\n";
    }
    cout<<"\n";
}

int main()
{
    int caz,i,a,b;
    nod *p;

    in>>n>>m;

    // Init
    init();

    // Solve
    for(i=1; i<=m; ++i)
    {
        in>>caz>>a>>b;

        if(caz==1)
        {
            if(tata[a] != tata[b])
            {
                join(a, b);
                //afis();
            }
        }
        else if(caz == 2)
        {
            if(tata[a] == tata[b]) out<<"DA\n";
            else out<<"NU\n";
        }

    }



    return 0;
}