Cod sursa(job #2475645)

Utilizator mionelIon. M mionel Data 17 octombrie 2019 11:48:44
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <iostream>
#include <fstream>

using namespace std;
ifstream f("disjoint.in");
ofstream g("disjoint.out");
int n, m, Tata[100001], Rang[100001], v, x, y;
int Find(int nr)
{ int R;
  R=nr;
  //Gasim radacina fiecarui nod
  while(Tata[R]!=R)
    R=Tata[R];
 //Compresia drumurilor
   Tata[nr]=R;
   return R;
}
inline void Unite(int x, int y)
{  //Atasam arborele mai mic de radacina arborelui mai mare
    if(Rang[x]>Rang[y])
        Tata[y]=x;
    else Tata[x]=y;
    //Daca atasam de y marim rangul lui y
    if(Rang[x]==Rang[y])
        Rang[y]++;
}
inline void Citire()
{ int i;
 f>>n>>m;
 //Initial avem n arbori cu un singur nod
 for(i=1;i<=n;i++)
   {Tata[i]=i;
    Rang[i]=1;}
  for(i=1;i<=m;i++)
      {f>>v;
      f>>x>>y;
       if(v==1)
       { Unite(Find(x),Find(y));

       }
       else { if(Find(x)==Find(y))
               g<<"DA"<<'\n';
               else g<<"NU"<<'\n';
            }
       }
}
int main()
{
Citire();
f.close();
g.close();
    return 0;
}