Cod sursa(job #2002186)

Utilizator lulian23Tiganescu Iulian lulian23 Data 18 iulie 2017 22:26:56
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <bits/stdc++.h>
#define NMAX 100001

using namespace std;

int a[ NMAX ], v[ NMAX ];
int n, m;

int f( int x ){
    int y, i;
    for (i = x; a[ i ] != i ; i = a[ i ]);

    for (; a[ x ] != x; ){
        y = a[ i ];
        a[ x ] = i;
        x = y;
    }
    return i;
}

void u(int x, int y){
    if (v[ x ] > v[ y ])
        a[ y ] = x;
    else
        a[ x ] = y;
    if (v[ x ] == v[ y ])
        ++v[ y ];
}

int main()
{
    ifstream cin("disjoint.in");
    ofstream cout("disjoint.out");
    cin >> n >> m;
     int x, y, cod;
    for (int i = 1; i <= n; i++)
        a[ i ] = i, v[ i ] = 1;
    for (int i = 1; i <= m; i++){
        cin >> cod >> x >> y;
     if (cod == 2)
        if (f( x ) == f( y ))
         cout << "DA" << '\n';
        else
         cout << "NU" << '\n';
     else{
        if (f( x ) == f( y )){
        fprintf(stderr,"%d ", i);
             return 0;
        }
        u(f( x ), f( y ));
     }
    }
}