Pagini recente » Cod sursa (job #3284336) | Cod sursa (job #2853011) | Cod sursa (job #2505905) | Cod sursa (job #2091422) | Cod sursa (job #920276)
Cod sursa(job #920276)
#include <fstream>
#include <vector>
using namespace std;
unsigned Find(unsigned x, vector<unsigned> &parent){
unsigned a=x;
while(parent[a]!=a) a=parent[a];
while(parent[x]!=a){
unsigned b=parent[x];
parent[x]=a;
x=b;
}
return a;
}
void Union(unsigned x, unsigned y,
vector<unsigned> &parent, vector<unsigned> &rank){
unsigned xroot=Find(x,parent);
unsigned yroot=Find(y,parent);
if(xroot!=yroot){
if(rank[xroot]>rank[yroot]) parent[yroot]=xroot;
else if(rank[xroot]<rank[yroot]) parent[xroot]=yroot;
else{
parent[xroot]=yroot;
rank[yroot]++;
}
}
}
int main(){
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
unsigned N, M;
fin>>N>>M;
vector<unsigned> parent(N),rank(N,0);
for(unsigned i=0;i<N;++i) parent[i]=i;
while(M--){
char t; unsigned x,y;
fin>>t>>x>>y;
x--; y--;
if(t=='1') Union(x,y,parent,rank);
if(t=='2'){
if(Find(x,parent)==Find(y,parent)) fout<<"DA\n";
else fout<<"NU\n";
}
}
}