Cod sursa(job #2772076)

Utilizator oana_tosa15Tosa Oana-Miruna oana_tosa15 Data 30 august 2021 17:50:41
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.92 kb
#include <fstream>
#include <algorithm>
#include <queue>
using namespace std;

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

const int MMax=100008;

queue < int > Q;
pair < int, int >P[MMax];

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

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() {
    int ok;
    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));
                //P[++k].first=v[i].x;
                //P[k].second=v[i].y;
            }
            //fout<<"Tatii numerelor "<<v[i].x<<" si "<<v[i].y<<" sunt "<<TT[v[i].x]<<" si "<<TT[v[i].y];
            //fout<<'\n';
                for(int q=i+1;q<=m;q++)
                {
                    while(v[q].cod==2)
                    {
                        if(TT[v[q].x]==TT[v[q].y]) {
                            fout<<"Tatal numerelor "<<v[q].x<<" si "<<v[q].y<<" este "<<TT[v[q].x];
                            fout<<'\n';
                            //fout<<"DA";
                            ok=1;
                            //Q.push(ok);
                        }
                        else {
                            fout<<"Tatii numerelor "<<v[q].x<<" si "<<v[q].y<<" sunt "<<TT[v[q].x]<<" si "<<TT[v[q].y];
                            fout<<'\n';
                            //fout<<"NU";
                            ok=0;
                            //Q.push(ok);
                        }
                    }
                    /*if(ok==1) {
                        fout<<"DA";
                        break;
                    }
                    else{ if(ok==0)
                        fout<<"NU";
                        break;
                    }*/
                    //if(Q.back()==1)
                      //  fout<<"DA";
                    //else
                      //  fout<<"NU";
                    //fout<<ok<<'\n';
                }
                /*if(ok==1) {
                    fout<<"DA";
                    break;
                }
                else {
                    fout<<"NU";
                    break;
                }*/
        }
        //fout<<'\n';
        //if(ok==1)
          //  fout<<"DA";
        //else
          //  fout<<"NU";

        /*while(v[i].cod==2)
        {
            if(TT[v[i].x]==TT[v[i].y])
                fout<<TT[v[i].x];
            else
                fout<<TT[v[i].x]<<" "<<TT[v[i].y];
        }*/
    }
}

/*void afisare()
{
    int i;
    for(i=1;i<=m;i++)
        if(v[i].cod==2) {
            if(TT[P[i].first]==TT[P[i].second])
                fout<<"DA";
            else
                fout<<"NU";
        }
}
*/
int main()
{
    read();
    for(int i=1;i<=m;i++)
    {
        //if(v[i].cod==1) {
            TT[i]=i;
            RG[i]==1;
       // }
    }
    solve();
   // afisare();
    return 0;
}