Cod sursa(job #945859)

Utilizator stefanzzzStefan Popa stefanzzz Data 3 mai 2013 09:42:27
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>
#include <vector>
#define MAXN 100005
using namespace std;
ifstream f("disjoint.in");
ofstream g("disjoint.out");

struct nod{
    int lvl;
    nod *tata;};

int n,m,tip,x,y;
bool da;
nod *ref[MAXN];

void uneste(int a,int b);
bool query(int a,int b);

int main()
{
    int i;
    f>>n>>m;
    for(i=1;i<=n;i++){
        ref[i]=new nod;
        ref[i]->tata=NULL;
        ref[i]->lvl=1;}
    for(i=1;i<=m;i++){
        f>>tip>>x>>y;
        if(tip==1)
            uneste(x,y);
        else{
            if(query(x,y))
                g<<"DA\n";
            else
                g<<"NU\n";}}
    f.close();
    g.close();
    return 0;
}

void uneste(int a,int b){
    nod *p,*q;
    p=ref[a];
    q=ref[b];
    while(p->tata!=NULL)
        p=p->tata;
    while(q->tata!=NULL)
        q=q->tata;
    if((p->lvl)<(q->lvl))
        p->tata=q;
    else{
        q->tata=p;
        if(q->lvl+1>p->lvl)
            (p->lvl)++;}}

bool query(int a,int b){
    nod *p,*q,*p1,*q1,*aux;
    p=p1=ref[a];
    q=q1=ref[b];
    while(p->tata!=NULL)
        p=p->tata;
    while(q->tata!=NULL)
        q=q->tata;
    while(p1->tata!=NULL){
        aux=p1->tata;
        p1->tata=p;
        p1=aux;}
    while(q1->tata!=NULL){
        aux=q1->tata;
        q1->tata=q;
        q1=aux;}
    return (p==q);}