E - K-th Largest Connected Components 题解
__S08577__ · · 题解
思路
首先,该题有求联通块,不妨使用并查集求两点是否在同一联通块并且进行合并操作。
代码
int find(int x){
return fa[x]==x?x:fa[x]=find(fa[x]);
}
void merge(int u,int v){
u=find(u),v=find(v);
if(u!=v){
if(s[u].size()<s[v].size()){
for(auto i:s[u]) s[v].insert(i);
}
else{
for(auto i:s[v]) s[u].insert(i);
swap(s[u],s[v]);
}
fa[u]=v;
}
}
int query(int u,int k){
u=find(u);
if(s[u].size()<k) return -1;
else{
set<int> :: iterator it;
for(it=s[u].begin();it!=s[u].end();it++){
k--;
if(k==0) return *it;
}
}
}