Cod sursa(job #1239698)

Utilizator BlueStrutAndrei Prahoveanu BlueStrut Data 9 octombrie 2014 16:56:13
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.75 kb
#include<cstdio>
using namespace std;
int i, a[100005], grad[100005], n, op, x, y, m;
int find(int x){
    int i=x, y;
    while (a[i]!=i) i=a[i];
    while (a[x]!=x) {
        y=a[x];
        a[x]=i;
        x=y;
    }
    return i;
}
void unite(int x, int y){
    if (grad[x]>grad[y]) a[x]=y; else a[y]=x;
    if (grad[x]==grad[y]) grad[x]++;
}
int main(){
    freopen("disjoint.in","r",stdin);
    freopen("disjoint.out","w",stdout);
    scanf("%d%d", &n, &m);
    for (i=1;i<=n;i++) {a[i]=i; grad[i]=1;}
    for (i=1;i<=m;i++) {
        scanf("%d%d%d", &op, &x, &y);
        if (op==1) unite(find(x), find(y));
        if (op==2) {
            if (find(x)==find(y)) printf("DA\n"); else printf("NU\n");
        }
    }
    return 0;
}