RT,写了个普通的并查集……
结果交上去WA了9个点。
求神仙看一看。
#include<bits/stdc++.h>
using namespace std;
const int si=20000+10;
int n,p;
int m,q;
int pa[2][si];
int size_[2][si];
int f[2][si];
int root(int pos,int x){
if(pa[pos][x]!=x){
return pa[pos][x]=root(pos,pa[pos][x]);
}
return pa[pos][x];
}
void Union(int pos,int x,int y){
int rx=root(pos,x),ry=root(pos,y);
if(rx==ry){
return;
}
if(size_[pos][rx]>=size_[pos][ry]){
pa[pos][ry]=rx;size_[pos][rx]+=size_[pos][ry];
}
else{
pa[pos][rx]=ry,size_[pos][ry]+=size_[pos][rx];
}
}
int ans1,ans2;
void sol(){
for(register int i=1;i<=max(n,m);++i){
if(root(0,f[0][i])){
++ans1;
}
if(root(1,f[1][i])){
++ans2;
}
}
cout<<min(ans1,ans2);
}
int main(){
scanf("%d%d%d%d",&n,&m,&p,&q);
for(register int i=1;i<=3*max(n,m);++i){
pa[0][i]=pa[1][i]=i;
size_[0][i]=size_[1][i]=1;
}
for(register int i=1;i<=p;++i){
int x,y;
scanf("%d%d",&x,&y);
f[0][i]=x,f[0][i]=y;
Union(0,x,y);
}
for(register int i=1;i<=q;++i){
int x,y;
scanf("%d%d",&x,&y);
f[1][i]=-x+n,f[1][i]=-y+n;
Union(1,-x+n,-y+n);
}
sol();
return 0;
}