Cod sursa(job #2079053)

Utilizator karakter98Irimia Robert karakter98 Data 30 noiembrie 2017 14:49:46
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <stdio.h>
using namespace std;

FILE* fin;
FILE* fout;

int n, m, cod, x, y;
int tati[100001];
int height[100001];

void join(int x, int y)
{
    int curr_node1 = x;
    int curr_node2 = y;

    int count1 = 0;
    while(tati[curr_node1])
    {
        curr_node1 = tati[curr_node1];
        ++count1;
    }

    int count2 = 0;
    while(tati[curr_node2])
    {
        curr_node2 = tati[curr_node2];
        ++count2;
    }

    if(count1 > height[curr_node1])
        height[curr_node1] = count1;
    if(count2 > height[curr_node2])
        height[curr_node2] = count2;

    if(height[curr_node1] > height[curr_node2])
        tati[curr_node2] = curr_node1;
    else tati[curr_node1] = curr_node2;
}

void redoConnections(int x, int tataX)
{
    while(x != tataX)
    {
        int aux = tati[x];
        tati[x] = tataX;
        x = aux;
    }
}

void query(int x, int y)
{
    int curr_node1 = x;
    int curr_node2 = y;

    while(tati[curr_node1])
        curr_node1 = tati[curr_node1];
    while(tati[curr_node2])
        curr_node2 = tati[curr_node2];

    if(curr_node1 != curr_node2)
        fprintf(fout, "NU\n");
    else fprintf(fout, "DA\n");

    redoConnections(x, curr_node1);
    redoConnections(y, curr_node2);
}

int main()
{
    fin = fopen("disjoint.in", "r");
    fout = fopen("disjoint.out", "w");

    fscanf(fin, "%d %d", &n, &m);

    for(int i = 0; i < m; ++i)
    {
        fscanf(fin, "%d %d %d", &cod, &x, &y);
        if(cod == 1)
            join(x, y);
        else if(cod == 2)
            query(x, y);
    }

    return 0;
}