Cod sursa(job #2045424)

Utilizator clau_rClaudia clau_r Data 22 octombrie 2017 13:11:42
Problema Paduri de multimi disjuncte Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <iostream>
#include <vector>
#include <list>
#include <queue>
#include <stdio.h>
#include <string.h>
#include <climits>
#include <set>

const int maxn = 50001;
const int inf = 1 << 30;

FILE *in = fopen("disjoint.in","r"), *out = fopen("disjoint.out","w");
using namespace std;

vector<int> parent;

void addUnions(int x, int y) {
    std::cout << "Add:" << x << " " << y << "\n";
    while(parent[x] != x) {
        x = parent[x];
    }
    
    while(parent[y] != y) {
        y = parent[y];
    }
    
    parent[y] = x;
    std::cout << "Done\n";
}

void sameUnion(int x, int y) {
    std::cout << "Same:" << x << " " << y << "\n";
    while(parent[x] != x) {
        x = parent[x];
    }
    
    while(parent[y] != y) {
        y = parent[y];
    }
    string res = (x == y) ? "DA\n" : "NU\n";
    std::cout << res;
    fprintf(out, "%s", (x == y) ? "DA\n" : "NU\n");
}

int main()
{
    int n, m, type, x, y;
    fscanf(in, "%d %d", &n, &m);
    parent.resize(n);
    for (int i = 0; i< n; ++i) {
        parent[i] = i;
    }
    for (int i = 0; i< m; ++i) {
        fscanf(in, "%d %d %d", &type, &x, &y);
        if (type == 1)
            addUnions(x, y);
        else
            sameUnion(x, y);
    }
}