Cod sursa(job #615873)

Utilizator dicu_dariaDaria Dicu dicu_daria Data 11 octombrie 2011 09:11:18
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.66 kb
#include <fstream>

using namespace std;
int T[100005],Rang[100005],n,m,i,tip;
int find(int x)
{
  int R,y;
  for(R=x;T[R]!=R;R=T[R]);
  for(;T[x]!=x;)
  {
    y=T[x];
    T[x]=R;
    x=y;
  }
  return R;
}
void unite(int x, int y)
{
  if(Rang[x]>Rang[y]) T[y]=x; else T[x]=y;
  if(Rang[x]==Rang[y]) Rang[y]++;
}
int main()
{
  int x,y;
    ifstream fi("disjoint.in");
    ofstream fo("disjoint.out");
    fi>>n>>m;
    for(i=1;i<=n;i++) { T[i]=i; Rang[i]=i;}
    for(i=1;i<=m;i++)
    {
      fi>>tip>>x>>y;
      if(tip==2)
      {
        if(find(x)==find(y)) fo<<"DA\n"; else fo<<"NU\n";
      } else unite(x,y);
    }
    return 0;
}