Cod sursa(job #329974)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 8 iulie 2009 12:37:36
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include<stdio.h>
#include<string.h>
#include<iostream>

using namespace std;

FILE*fin=fopen("disjoint.in","r");
FILE*fout=fopen("disjoint.out","w");

#define nm 100005
#define maxbuf 65536

int n,m,tata[nm],grad[nm],ind;
char buf[maxbuf];

inline void refbuf()
{
      int ans = fread(buf,1,maxbuf,fin);
      if (ans < maxbuf) buf[ans]=0;
      ind = 0;   
}

inline int getnr()
{
       int ans=0;
       one:
           while(ind<maxbuf&&!isdigit(buf[ind])) ind++;
           if(ind==maxbuf)
           {
             refbuf();
             goto one;
           }
       two:
           while(ind<maxbuf&&isdigit(buf[ind]))
           {
             ans=ans*10+buf[ind]-'0';
             ind++;
           }    
           if(ind==maxbuf)
           {
             refbuf();
             goto two;
           }
       return ans;    
}

inline int find(int x)
{
      int nod=x,wt;
      
      while(tata[nod]!=nod) nod=tata[nod];
      
      while(x!=nod)
      {
        wt=tata[x];
        tata[x]=nod;
        x=wt;
      }   
      
      return nod;
}

void unite(int x,int y)
{
     if(grad[x]>grad[y]) tata[y]=x;
     else tata[x]=y;
     
     if(grad[x]==grad[y]) grad[y]++;
}

int main()
{
    int i,a,b,op;
    
    refbuf();
    
    n=getnr();
    m=getnr();
    
    for(i=1;i<=n;i++)
    {
      tata[i]=i;
      grad[i]=1;
    }
    
    for(i=1;i<=m;i++)
    {
      op=getnr();
      a=getnr();
      b=getnr();
      
      int x,y;
      
      x=find(a);
      y=find(b);
      
      if(op==1) unite(x,y);
      else if(x==y) fprintf(fout,"DA\n");
           else fprintf(fout,"NU\n"); 
    }
    
    fclose(fin);
    fclose(fout);
    
    return 0;
}