Cod sursa(job #1233770)

Utilizator andreii2Ilie Catalin-Andrei andreii2 Data 25 septembrie 2014 23:43:31
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include <cstdio>

using namespace std;

int n,m,RG[100005],T[100005];

void cauta(int x,int &rez)
{
    int aux=x;
    int z;
    while(T[x]!=x)x=T[x];
    while(T[aux]!=aux){z=T[aux];T[aux]=x;aux=z;}
    rez=x;
}

void uneste(int x,int y)
{
    int aux;
    int x1;cauta(x,x1);
    int y1;cauta(y,y1);
    if(RG[x1]==RG[y1]){T[y1]=x1;RG[x1]++;}
    else {if(x1>y1){aux=x1;x1=y1;y1=aux;}T[x1]=y1;}
}

int main()
{
    int i,x1,y1,r,x,y;
    FILE *f=fopen("disjoint.in","r");
    FILE *g=fopen("disjoint.out","w");
    fscanf(f,"%d %d",&n,&m);
    for(i=1;i<=n;i++){RG[i]=1;T[i]=i;}
    for(i=1;i<=m;i++)
    {
        fscanf(f,"%d %d %d",&r,&x,&y);
        if(r==1)uneste(x,y);
        else
        if(r==2) {cauta(x,x1);cauta(y,y1);if(x1==y1)fprintf(g,"DA\n"); else fprintf(g,"NU\n");}
    }
    fclose(f);
    fclose(g);
    return 0;
}