Cod sursa(job #257389)

Utilizator alecmanAchim Ioan Alexandru alecman Data 13 februarie 2009 10:31:45
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include<stdio.h>

#define INPUT "disjoint.in"
#define OUTPUT "disjoint.out"
#define NMAX 100001

FILE *fin = fopen(INPUT, "r"), *fout = fopen(OUTPUT, "w");

long N, M;
long Father[ NMAX ], Degree[ NMAX ];

long root(long Node)
{
  long nNode = Node;
  long temp;
  
  while(nNode != Father[nNode])
    nNode = Father[nNode];

  while(Father[Node] != Node)
  {
    temp = Father[Node];
    Father[Node] = nNode;
    Node = temp;
  }

  return nNode;
}

void join(long Node1, long Node2)
{
  long Root1 = root(Node1);
  long Root2 = root(Node2);

  if(Degree[ Root1 ] > Degree[ Root2 ])
    Father[ Root2 ] = Root1;
  else
    Father[ Root1 ] = Root2;

  if(Degree[ Root1 ] == Degree[ Root2 ])
    ++Degree[ Root2 ];
}

void solve()
{
  long Code, Node1, Node2;

  for(long i = 0; i < M; ++i)
  {
    fscanf(fin, "%ld %ld %ld", &Code, &Node1, &Node2);

    if(Code == 1)
      join(Node1, Node2);
    else
    {
      if(root(Node1) == root(Node2))
        fprintf(fout, "DA\n");
      else
        fprintf(fout, "NU\n");
    }
  }
}

int main()
{
  fscanf(fin, "%ld %ld", &N, &M);

  for(long i = 0; i < N; ++i)
  {
    Father[ i ] = i;
    Degree[ i ] = i;
  }

  solve();

  fclose(fin);
  fclose(fout);

  return 0;
}