Cod sursa(job #2772080)

Utilizator oana_tosa15Tosa Oana-Miruna oana_tosa15 Data 30 august 2021 17:53:04
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.1 kb
#include <fstream>
#include <algorithm>

using namespace std;

ifstream fin("disjoint.in");
ofstream fout("disjoint.out");

const int MMax=100008;

int n,m,TT[MMax], RG[MMax];

struct muchie{
    int cod,x,y;
}v[MMax];

void read(){
    fin>>n>>m;
    int i;
    for(i=1;i<=m;i++)
        fin>>v[i].cod>>v[i].x>>v[i].y;
}

int Find(int Nod) {
    while(TT[Nod]!=Nod)
        Nod=TT[Nod];
    return Nod;
}

void unire(int x, int y) {
    int i,nr=0;
    if(RG[x] < RG[y]) {
        for(i=1;i<=n;i++) {
            if(TT[i]==TT[x] && i!=x) {
                TT[x]=y;
                TT[i]=y;
                nr++;
            }
        }
         if(nr==0)
            TT[x]=y;
    }
   nr=0;
    if(RG[y] < RG[x]) {
        for(i=1;i<=n;i++) {
            if(TT[i]==TT[y] && i!=y) {
                TT[y]=x;
                TT[i]=x;
                nr++;
           }
        }
        if(nr==0)
            TT[y]=x;
    }
    nr=0;
    if(RG[x] == RG[y])
    {
        for(i=1;i<=n;i++) {
            if(TT[i]==TT[y] && i!=y) {
                TT[y]=x;
                TT[i]=x;
                nr++;
            }
        }
        if(nr==0)
            TT[y]=x;
        RG[x]++;
    }
}

void solve() {
    for(int i=1;i<=m;i++) {
        if(v[i].cod==1) {
            if(Find(v[i].x) != Find(v[i].y)) {
                unire(Find(v[i].x), Find(v[i].y));
            }
                for(int q=i+1;q<=m;q++)
                {
                    if(v[q].cod==1)
                        q=m+1;
                    else {
                    {
                        if(TT[v[q].x]==TT[v[q].y]) {
                            fout<<"DA";
                            fout<<'\n';
                        }
                        else {
                            fout<<"NU";
                            fout<<'\n';
                        }
                    }
                }
            }
        }
    }
}
int main()
{
    read();
    for(int i=1;i<=m;i++)
    {
        TT[i]=i;
        RG[i]==1;
    }
    solve();
    return 0;
}