Mai intai trebuie sa te autentifici.
Cod sursa(job #2424276)
Utilizator | Data | 22 mai 2019 20:34:56 | |
---|---|---|---|
Problema | Paduri de multimi disjuncte | Scor | 40 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 1.11 kb |
#include <fstream>
#include <bits/stdc++.h>
using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
int N, M;
int tati[100005];
int rang[100005];
int find(int nod) ///returnez tatal nodului nod
{
if(nod==tati[nod])
return nod;
tati[nod]=find(tati[nod]);
return tati[nod];
}
void Uniune(int x, int y)
{
x=find(x);
y=find(y);
///Unesc subarborele cu inaltimea mai mica la cel mai mare
if(rang[x]>rang[y])
{
rang[x]+=rang[y];
tati[y]=x;
}
else
{
tati[x]=y;
rang[y]+=rang[x];
}
/*if(rang[x]==rang[y])
rang[y]++; */
}
int main()
{
fin>>N>>M;
for(int i=1;i<=N;i++)
{
tati[i]=i;
rang[i]=1;
}
for(int i=1;i<=M;i++)
{
int c,x,y;
fin>>c>>x>>y;
if(c==1)
Uniune(x,y);
else
{
if(find(x)==find(y))
fout<<"DA"<<endl;
else
fout<<"NU"<<endl;
}
}
return 0;
}