题目链接
测试点记录
#include<bits/stdc++.h>
using namespace std;
int n,p,m,q;
int x,y;
int a1[10005],a2[10005];//建立两个并查集,a1为n公司,a2为m公司
int find1(int j)
{
if(a1[j]!=j)j=find1(a1[j]);
return j;
}
int find2(int k)
{
if(a2[k]!=k)k=find2(a2[k]);
return k;
}
int main()
{
scanf("%d%d%d%d",&n,&p,&m,&q);
int cnt1=0,cnt2=0;//分别记录小明小红认识的总人数
for(int i=1;i<=n;i++)a1[i]=i;//初始化
for(int i=1;i<=m;i++)a2[i]=i;
for(int i=0;i<p;i++)
{
scanf("%d%d",&x,&y);
int fx=find1(a1[x]);
int fy=find1(a1[y]);
if(fx!=fy)a1[fx]=a1[fy];
}
for(int i=0;i<q;i++)
{
scanf("%d%d",&x,&y);
int fx=find2(a2[-x]);
int fy=find2(a2[-y]);
if(fx!=fy)a2[fx]=a2[fy];
}
for(int i=1;i<=n;i++)a1[i]=find1(a1[i]);
for(int i=1;i<=m;i++)a2[i]=find2(a2[i]);
x=a1[1],y=a2[1];
for(int i=1;i<=n;i++)if(a1[i]==x)cnt1++;//查询认识的人
for(int i=1;i<=m;i++)if(a2[i]==y)cnt2++;
printf("%d",min(cnt1,cnt2));
return 0;
}