Cod sursa(job #3193455)

Utilizator tudorp_Pop Tudor tudorp_ Data 14 ianuarie 2024 17:17:10
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.79 kb
#include <bits/stdc++.h>

using namespace std;

const string file_name = "coborare";
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");


const int NMAX = 300001;
const int Mod = 100003;
int T[NMAX];
int rang[NMAX];

int Rad(int k)
{
    if(T[k]==0)
        return k;
    else
    {
        int x = Rad(T[k]);
        T[k] = x;
        return x;
    }
}

void Union(int p, int k)
{
    int rk = Rad(k), rp = Rad(p);
    if(rk!=rp)
    {
        if(rang[rk]>rang[rp])
        {
            T[rp] = rk;
        }
        else
        {
            T[rk]=rp; //rp e tatal lui rk
            if(rang[rk]==rang[rp])
                rang[rp]++; //rangul = gradul tatalui creste cu 1
        }
    }
}

/*
void DFS(int nod)
{
    viz[nod] = 1;
    for(auto nd:G[nod])
    {
        if(!viz[nd])
            DFS(nd);
    }
}

void BFS(int nods)
{
    queue<int> q;
    q.push(nods);
    while(!q.empty())
    {
        int nc = q.front();
        q.pop();
        for(auto nbr: G[nc])
        {
            if(!viz[nbr])
            {
                viz[nbr] = 1;
                T[nbr] = nc;
                q.push(nbr);
            }
        }
    }
}*/

//Dijkstra - bfs pentru cel mai mic drum de la un nod selectat la toate celelalte noduri, adaugam in PQ nodul cu - pt. sortare -> min heap //

int N,M,i,op;


int main()
{
    fin>>N>>M;
    int x,y;
    for(i=1;i<=N;i++)
    {
        T[i] = i;
        rang[i] = 1;
    }
    for(i=1;i<=M;i++)
    {
        fin>>op>>x>>y;
        if(op==1)
        {
            if(Rad(x)==Rad(y))
                fout<<"DA"<<'\n';
            else fout<<"NU"<<'\n';
        }
        else if(op==2)
        {
            if(Rad(x)==Rad(y))
                Union(x,y);
        }
    }
}