Mai intai trebuie sa te autentifici.
Cod sursa(job #2397695)
| Utilizator | Data | 4 aprilie 2019 18:11:39 | |
|---|---|---|---|
| Problema | Paduri de multimi disjuncte | Scor | 0 |
| Compilator | cpp-64 | Status | done |
| Runda | Arhiva educationala | Marime | 1.3 kb |
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
void Union(vector<int> &comp,vector<vector<int>> &subset, int x, int y)
{
size_t xr=comp[x],yr=comp[y];
if(subset[comp[x]].size() <= subset[comp[y]].size())
{
size_t size1=subset[xr].size();
for(int i=0;i<size1;i++)
{
subset[yr].push_back(subset[xr][i]);
comp[subset[xr][i]]=yr;
}
subset[xr].clear();
}else {
size_t size2=subset[yr].size();
for(int i=0;i<size2;i++)
{
subset[xr].push_back(subset[yr][i]);
comp[subset[yr][i]]=xr;
}
subset[yr].clear();
}
}
void check(vector<int> &comp,int x,int y)
{
if(comp[x]==comp[y])
fout<<"DA/n";
else
fout<<"NU/n";
}
int main()
{
int n,m,op,op1,op2;
fin>>n>>m;
vector<vector<int>> subset(n+1);
vector<int> comp(n+1);
for(int i=1;i<=n;i++)
{
comp[i]=i;
subset[i].push_back(i);
}
for(int i=0;i<m;i++)
{
fin>>op>>op1>>op2;
if(op==1)
Union(comp,subset,op1,op2);
else
check(comp,op1,op2);
}
}
