Cod sursa(job #2837380)

Utilizator SebytomitaTomita Sebastian Sebytomita Data 22 ianuarie 2022 10:17:46
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.33 kb
//#include <fstream>
//#include <vector>
//
//#define NMAX 100004
//
//using namespace std;
//ifstream cin("disjoint.in");
//ofstream cout("disjoint.out");
//
////vector <int> a[NMAX];
//
//int n,i,x,y,cer,m;
//int tata[NMAX],h[NMAX];
//
//int Find_compr(int x);
//void Union(int x, int y);
//
//int main()
//{
//    cin>>n>>m;
//    for(i=1; i<=m; i++)
//    {
//        cin>>cer>>x>>y;
//        if(cer==1)
//        {
//            ///union
//            Union(x,y);
//        }
//        if(cer==2)
//        {
//            ///find
//            if(Find_compr[x]==Find_compr[y])
//                cout<<"DA"<<'\n';
//            else
//                cout<<"NU"<<'\n';
//
//        }
//    }
//
//
//    return 0;
//}
//
//
//int Find_compr(int x)
//{
//    int r;
//    r=x;
//    while(tata[r])
//            r=tata[r];
//    while(tata[x])
//    {
//        int r2=tata[x];
//        tata[x]=r;
//        x=r2;
//    }
//    return r;
//}
//
//void Union(int x, int y)
//{
//    x = Find_compr(x);
//    y = Find_compr(y);
//    if(x==y)
//        return;
//    if(h[x]<h[y])
//    {
//        tata[x]=y;
//    }
//    if(h[x]>h[y])
//        tata[y]=x;
//    if(h[x]==h[y])
//    {
//        tata[x]=y;
//        h[y]++;
//    }
//}
//


#include <fstream>
#define NMAX 100002
using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
int tata[NMAX],h[NMAX];
void citire();
int gasire(int x);
void unire(int x, int y);
int n,m;
int main()
{
    citire();
    return 0;
}
void citire()
{
    int i,j,tip,x,y;
    fin>>n>>m;
    for(j=1;j<=m;j++)
    {
     fin>>tip>>x>>y;
     if(tip==1)
     {
          unire(x,y);
     }
     else
     {
         if(gasire(x)!=gasire(y))
            fout<<"NU"<<'\n';
         else
            fout<<"DA"<<'\n';
     }
    }
}
int gasire(int x)
{
    int r;
    r=x;
    while(tata[r])
            r=tata[r];
    while(tata[x])
    {
        int r2=tata[x];
        tata[x]=r;
        x=r2;
    }
    return r;
}
void unire(int x, int y)
{
     x=gasire(x);
     y=gasire(y);
     if(x==y)
        return;
     if(h[x]<h[y])
     {
        tata[x]=y;
     }
    if(h[x]>h[y])
            tata[y]=x;
    if(h[x]==h[y])
     {
         tata[x]=y;
         h[y]++;
     }
}