Cod sursa(job #2549406)

Utilizator ArmivioIlas Armand Viorel Armivio Data 17 februarie 2020 17:36:13
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2 kb
#include <bits/stdc++.h>
#define NMAX 100005
using namespace std;
ifstream f("disjoint.in");
ofstream g("disjoint.out");
int componente[NMAX],apartenentaLaComponente[NMAX],n,m,nrComponente;
//nr componente doar numara componentele care initial sunt diferite,
//la final sunt mai putine dar am folosit asa pt mai putine parcurgeri
int main()
{
    f>>n>>m;
    int quest,op,x,y,aux,i;
    for(quest=1;quest<=m;quest++)
    {
        f>>op>>x>>y;
        if(op==1) //adaugare
        {
            if(apartenentaLaComponente[x]==0 && apartenentaLaComponente[y]==0)//creeem comp conex cu 2 noduri: x si y
            {
                apartenentaLaComponente[x]=apartenentaLaComponente[y]=++nrComponente;
                componente[nrComponente]=2;
            }
            else if(apartenentaLaComponente[x]==0)//adaugam x la comp conex din y
            {
                apartenentaLaComponente[x]=apartenentaLaComponente[y];
                componente[apartenentaLaComponente[x]]++;
            }
            else if(apartenentaLaComponente[y]==0)//adaugam y la comp conex din x
            {
                apartenentaLaComponente[y]=apartenentaLaComponente[x];
                componente[apartenentaLaComponente[x]]++;
            }
            else//combinam 2 componente conexe
            {
                if(apartenentaLaComponente[x]!=apartenentaLaComponente[y])//daca nu sunt deja in aceeasi componenta conexa
                {
                    componente[apartenentaLaComponente[x]]+=componente[apartenentaLaComponente[y]];
                    aux=apartenentaLaComponente[y];
                    for(i=1;i<=n;i++)
                    {
                        if(apartenentaLaComponente[i]==aux) apartenentaLaComponente[i]=apartenentaLaComponente[x];
                    }
                }
            }
        }
        else
        {
            if(apartenentaLaComponente[x]==apartenentaLaComponente[y]) g<<"DA\n";
            else g<<"NU\n";
        }
    }
    return 0;
}