Cod sursa(job #2199076)

Utilizator dobrandreiAndrei Dobra dobrandrei Data 26 aprilie 2018 17:08:34
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <stdio.h>
using namespace std;
FILE *f,*g;

int n,m;
int tata[100002],rang[100002];

void read()
{
    fscanf(f,"%d %d",&n,&m);
    for(int i=1;i<=n;i++)
        tata[i]=i,rang[i]=1;
}

int Find(int node)
{
    int r=node,aux;
    while(r!=tata[r])
        r=tata[r];
    while(node!=tata[node])
    {
        aux=tata[node];
        tata[node]=r;
        node=aux;
    }
    return r;
}

void unite(int x, int y)
{
    if(rang[x]>rang[y])
        tata[y]=x;
    else
        tata[x]=y;
    if(rang[y]==rang[x])
        rang[y]++;
}

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

    read();

    int x,y,cod;

    for(int i=1;i<=m;i++)
    {
        fscanf(f,"%d %d %d",&cod,&x,&y);
        if(cod==2)
        {
            if(Find(x)==Find(y))
                fprintf(g,"DA\n");
            else
                fprintf(g,"NU\n");
        }
        else
            unite(Find(x),Find(y));
    }
    return 0;
}