P2078 朋友 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题意:
思路:
这是一道并查集模板题,但是有很多坑点
坑点总结:
1.下标为负导致RE,下标为负一般用map解决
2.祖先应该用find函数,而不是f[],因为路径压缩没有彻底,并查集是每查一次就压缩一点的数据结构
Code:
#include <bits/stdc++.h>
using namespace std;
const int mxn=2e4+10;
int n,m,p,q,fu=0,zheng=0;
unordered_map<int,int> f;
int find(int x){
return f[x]=(x==f[x]?x:find(f[x]));
}
void join(int x,int y){
int f1=find(x),f2=find(y);
if(f1!=f2) f[f1]=f2;
}
void init(){
for(int i=-m;i<=n;i++) f[i]=i;
}
int main(){
scanf("%d%d%d%d",&n,&m,&p,&q);
init();
for(int i=1;i<=p;i++){
int x,y;
scanf("%d%d",&x,&y);
join(x,y);
}
for(int i=1;i<=q;i++){
int x,y;
scanf("%d%d",&x,&y);
join(x,y);
}
for(int i=-m;i<=n;i++){
if(i<0&&find(i)==find(-1)) fu++;
if(i>0&&find(i)==find(1)) zheng++;
}
printf("%d\n",min(fu,zheng));
return 0;
}