Pagini recente » Cod sursa (job #2279160) | Cod sursa (job #2430757) | Cod sursa (job #2661240) | Cod sursa (job #628536) | Cod sursa (job #2948929)
///Problema 2 - O(m log n)
///Link:
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
vector<int> parents;
vector<int> lungime;
///Gasirea radacinii unui subarbore
int find_parent(int node){
if(!parents[node]){
return node;
}else{
return parents[node] = find_parent(parents[node]);
}
}
int main()
{
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
int nodes, ops, op;
fin>>nodes>>ops;
parents.resize(nodes+1, 0);
lungime.resize(nodes+1, 1);
while(ops){
ops--;
fin>>op;
int node1, node2;
fin>>node1>>node2;
///Ne vom construi subarbori si vom salva pentru fiecare nod cate un tata, iar radacina va avea tatal 0
int a = find_parent(node1);
int b = find_parent(node2);
switch(op){
case 1:
if(a != b){
///Daca cele doua noduri au radacini diferinte, inseamna ca nu sunt in aceasi cc
///Astfel, atribuim ca tata a radacinii primului nod radacina celuilalt nod
if(lungime[b] > lungime[a]){
parents[a] = b;
lungime[a] += lungime[b];
}else{
parents[b] = a;
lungime[b] += lungime[a];
}
}
break;
case 2:
///La cazul 2, doar verificam daca cele doua noduri au aceasi radacina
if(a == b){
fout<<"DA"<<endl;
}else{
fout<<"NU"<<endl;
}
break;
default:
fout<<"Error";
}
}
fin.close();
fout.close();
return 0;
}