Cod sursa(job #1495757)

Utilizator serbanSlincu Serban serban Data 3 octombrie 2015 16:30:21
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <bits/stdc++.h>

using namespace std;

int n;
int v[100000];

struct node{
    node *next;
    int inf;
};
node *L[100000];
node *last[100000];

void add(node *&start, int inf) {
    node *one = new node;
    one->inf = inf;
    one->next = start;
    start = one;
}

void mergeList(int i, int j) {
    last[v[i]]->next = L[v[j]];
    last[v[i]] = last[v[j]];
    for(node *p = L[v[j]]; p; p = p->next) {
        v[p->inf] = v[L[v[i]]->inf];
        L[p->inf] = L[v[i]];
    }
}

int main()
{
    FILE *f = fopen("disjoint.in", "r");
    FILE *g = fopen("disjoint.out", "w");
    int m, x, y, t;
    fscanf(f, "%d %d", &n, &m);

    for(int i = 1; i <= n; i ++) {
        add(L[i], i);
        last[i] = L[i];
        v[i] = i;
    }

    for(int i = 1; i <= m; i ++) {
        fscanf(f, "%d %d %d", &t, &x, &y);
        if(t == 1) mergeList(x, y);
        else {
            if(v[x] == v[y])
                fprintf(g, "DA\n");
            else fprintf(g, "NU\n");
        }
    }
    return 0;
}