Cod sursa(job #1731742)

Utilizator liviu23Liviu Andrei liviu23 Data 19 iulie 2016 19:21:17
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <fstream>
#include <iostream>
#define f first
#define s second
using namespace std;

int n;
pair<int,int> v[100005];

int findParent(int x) {
    int p=x;
    while(v[p].f!=p)
        p=v[p].f;
    while(x!=p) {
        int last=x;
        x=v[x].f;
        v[last].f=p;
    }
    return p;
}

void mergeSets(int x, int y) {
    x=findParent(x);
    y=findParent(y);
    if(x==y)
        return;
    if(v[x].s<v[y].s)
        v[x].f=y;
    else if(v[x].s>v[y].s)
        v[y].f=x;
    else
        v[x].f=y,v[x].s++;
}

int main()
{
    ifstream fin("disjoint.in");
    ofstream fout("disjoint.out");
    int m,a,b,c;
    fin>>n>>m;
    for(int i=1;i<=n;i++)
        v[i].f=i;
    for(int i=1;i<=m;i++) {
        fin>>a>>b>>c;
        if(a==1) {
            mergeSets(b,c);
        }
        else {
            if(findParent(b)==findParent(c))
                fout<<"DA\n";
            else
                fout<<"NU\n";
        }
    }
    return 0;
}