#include <bits/stdc++.h>
using namespace std;
vector<int> r;
vector<int> p;
unordered_map<int,unordered_map<int,int>> M;
vector<int> elementos;
int n;
void init(int n){
r.assign(n,0);
for(int i=0;i<n;i++){
p.push_back(i);
}
elementos.assign(n,1);
}
int encontrar(int x){
if(p[x]!=x){
p[x]=encontrar(p[x]);
}
return p[x];
}
void unir(int x,int y){
int r_x,r_y;
r_x=encontrar(x);
r_y=encontrar(y);
if(r[r_x]>r[r_y]){
r[r_x]+=r[r_y];
p[r_y]=r_x;
}else{
r[r_y]+=r[r_x];
p[r_x]=r_y;
}
}
void initialize(int N){
n=N;
init(n);
}
int hasEdge(int u, int v){
int capital1,capital2,capitalganadora;
capital1=encontrar(u);
capital2=encontrar(v);
if(M[capital1][capital2]==elementos[capital1]*elementos[capital2]-1){
unir(u,v);
capitalganadora=encontrar(u);
if(capital1==capitalganadora){
elementos[capital1]+=elementos[capital2];
for(auto x:M[capital2]){
M[capital1][x.first]+=x.second;
M[x.first][capital1]=M[capital1][x.first];
}
}else{
elementos[capital2]+=elementos[capital1];
for(auto x:M[capital1]){
M[capital2][x.first]+=x.second;
M[x.first][capital2]=M[capital2][x.first];
}
}
return 1;
}else{
M[capital1][capital2]++;
M[capital2][capital1]=M[capital1][capital2];
return 0;
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |