Cod sursa(job #1606407)

Utilizator RadduFMI Dinu Radu Raddu Data 20 februarie 2016 11:21:40
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.82 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("disjoint.in");
ofstream g("disjoint.out");
 int n,m,k,dad[100005],ad[100005],st[100005];

 int Mult(int x)
 { int i;
    k=1; st[k]=x;
   while(dad[x]!=x)
    {x=dad[x];
     k++; st[k]=x;
    }

   for(i=1;i<=k;i++)
    dad[st[i]]=x;

   return x;
 }

 void Unite(int x,int y)
 { x=Mult(x); y=Mult(y);
   if (ad[x]>ad[y])
    {dad[y]=x;
     ad[x]=max(ad[x],ad[y]+1);
    }
    else
     {dad[x]=y;
      ad[y]=max(ad[y],ad[x]+1);
     }
 }
int main()
{ int i,t,x,y;
    f>>n>>m;

    for(i=1;i<=n;i++)
     {dad[i]=i;
      ad[i]=1;
     }

    for(i=1;i<=m;i++)
    { f>>t>>x>>y;
      if (t==1) Unite(x,y);
       else
       {
           g<<(Mult(x)==Mult(y)?"DA":"NU")<<"\n";
       }
    }

    return 0;
}