Cod sursa(job #2445334)

Utilizator MatteoalexandruMatteo Verzotti Matteoalexandru Data 3 august 2019 17:22:06
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
// Matteo Verzotti - C++
#include <iostream><
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <stack>
#include <queue>
#include <deque>
#include <vector>
#include <ctime>
#include <map>
#include <chrono>
#include <cmath>
#define INF 0x3f3f3f3f
#define MAX(a,b) a>b ? a:b
#define MIN(a,b) a<b ? a:b

using namespace std;

const int NMAX = 100000;

int parent[5 + NMAX];
int szg[5 + NMAX];

int n, m;

int FIND(int x)
{
    int y;
    for(y = x; parent[y] != y; y = parent[y]); // atat timp cat nu sunt la radacina
    // aplic compresia drumurilor
    for(; parent[x] != x;){
        int cx = parent[x];
        parent[x] = y;
        x = cx;
    }
    return y;
}

void unite(int x,int y)
{
    if(szg[x] > szg[y]){
        parent[y] = x;
        szg[x] += szg[y];
        szg[y] = szg[x];
    }
    else{
        parent[x] = y;
        szg[y] += szg[x];
        szg[x] = szg[y];
    }
}

int main()
{
    freopen("disjoint.in","r",stdin);
    freopen("disjoint.out","w",stdout);
    scanf("%d%d", &n, &m);
    for(int i=1; i<=n; i++){
        parent[i] = i;
        szg[i] = 1;
    }
    for(int i=1; i<=m; i++){
        int p, a, b;
        scanf("%d%d%d", &p, &a, &b);
        if(p == 1){
            unite(FIND(a),FIND(b));
        } else{
            if(FIND(a) == FIND(b)) printf("DA\n");
            else printf("NU\n");
        }
    }
    /*for(int i=1; i<=n; i++){
        int p = parent[i];
        printf("%d\n",szg[p]);
    }*/
    return 0;
}