Cod sursa(job #2728662)

Utilizator IoanMihaiIoan Mihai IoanMihai Data 23 martie 2021 15:37:55
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.87 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
int n, m, x, y, z, sef[100005], rang[100005];
int find(int sef[], int i)
{
    if (sef[i] != i)
        sef[i] = find(sef, sef[i]);
    return sef[i];
}
void unite(int sef[], int x, int y)
{
    int xx = find(sef, x);
    int yy = find(sef, y);
    if (rang[xx] > rang[yy])
        sef[yy] = xx;
    else
        sef[xx] = yy;
    if (rang[xx] == rang[yy])
        rang[yy] ++;
}
int main() {
    fin >> n >> m;
    for (int i=1;i<=n;i++){
        sef[i] = i;
        rang[i] = 1;
    }
    for (int i=1;i<=m;i++){
        fin >> x >> y >> z;
        if (x == 2){
            if (find(sef, y) == find(sef, z)){
                fout << "DA\n";
            }else{
                fout << "NU\n";
            }
        }else{
            unite(sef, y, z);
        }
    }
    return 0;
}