Cod sursa(job #239362)

Utilizator mika17Mihai Alex Ionescu mika17 Data 4 ianuarie 2009 17:43:20
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include <fstream>

using namespace std;

const int NMAX = 100001;
int N,M,S[NMAX],h[NMAX];
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");

void set_union(int a,int b)
{
        if(h[a] < h[b])
          S[a] = b;
         else
         {
          S[b] = a;
          if(h[a] == h[b]) h[a]++;
         }
}

int set_find(int a)
{
        return S[a] == a ? a : ( S[a] = set_find(S[a]) ) ;
}

int main()
{
        fin>>N>>M;

        for(int i = 1; i <= N; ++i)
         S[i] = i;

        int op,a,b;
        while(M--)
        {
         fin>>op>>a>>b;
         switch(op)
         {
          case 1: if(set_find(a) != set_find(b) )
                    set_union(set_find(a),set_find(b));
                  break;
          case 2: set_find(a) != set_find(b) ? fout<<"NU\n" : fout<<"DA\n";
                  break;
         }
        }

        return 0;
}