Cod sursa(job #1641560)

Utilizator AdrianVrAdrian Stefan Vramulet AdrianVr Data 9 martie 2016 00:59:18
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.79 kb
#include <bits/stdc++.h>
#define Nmax 100010
using namespace std;
ifstream f("disjoint.in");
ofstream g("disjoint.out");
int n,m,t,h[Nmax],M[Nmax],x,y;
int Find(int x)
{
    int R=x,aux;
    while(M[R]!=R)
        R=M[R];
    for(; M[x]!=x;)
    {
        aux=M[x];
        M[x]=R;
        x=aux;
    }
    return R;
}
void Union(int x,int y)
{if(h[x]>h[y])
  M[y]=x;
 else
  M[x]=y;
 if(h[x]==h[y])
  h[x]++;
}
int main()
{
    f>>n>>m;
    for(int i=1; i<=n; i++)
    {
        h[i]=i;
        M[i]=i;
    }
    for(int i=1; i<=m; i++)
    {
        f>>t>>x>>y;
        if(t==1)
          Union(Find(x),Find(y));
        else
            if(Find(x)==Find(y))
                g<<"DA"<<'\n';
            else
                g<<"NU"<<'\n';
    }
    return 0;
}