Nu aveti permisiuni pentru a descarca fisierul grader_test9.ok
Cod sursa(job #1524751)
Utilizator | Data | 14 noiembrie 2015 13:35:12 | |
---|---|---|---|
Problema | Paduri de multimi disjuncte | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.66 kb |
#include <iostream>
#include <fstream>
using namespace std;
int tata[100001], fii[100001],x,y,i,m,n,cod;
int radacina(int nod) // cauta radacina unui arbore aka. ia un nod si merge de la tata la tata pana cand intalneste
{ // nodul care il are ca tata pe el insusi
if (tata[nod]==nod)
return nod;
return radacina (tata[nod]);
}
void uneste (int nod1, int nod2)
{
int rad1 = radacina (nod1);
int rad2 = radacina (nod2);
if (rad1==rad2) return;
if (fii[rad1]>=fii[rad2])
{
fii[rad1] += fii[rad2];
tata[rad2]=rad1;
}
else
{
fii[rad2]+=fii[rad1];
tata[rad1]=rad2;
}
}
int radcomuna(int nod1, int nod2)
{
if ( radacina(nod1)==radacina(nod2) ) return 1;
else return 0;
}
int main()
{
ifstream f("disjoint.in");
ofstream g("disjoint.out");
f>>n>>m;
for (i=1;i<=n;i++)
{
tata[i]=i; // initial toate nodurile sunt separate, existand n componente conexe. aka Fiecare nod este propriul sau tata.
fii[i]=1; // la numarul fiilor unui nod se adauga si nodul tata
}
for(i=1;i<=m;i++)
{
f>>cod>>x>>y;
if (cod==1) uneste(x,y);
if (cod==2)
{
if (radcomuna(x,y)==1) g<<"DA"<<'\n';
else g<<"NU"<<'\n';
}
}
return 0;
}