这道题一直是10分(代码在最下面),所以我下载了样例2的数据。
我的程序很明显将两个公司的人分别并查集,并将所有编号都增加10000以避免负数。
在公司1并查集合并时,我一直将编号1(即程序中的10001)放在祖先的位置(第21行),但用样例2 DEBUG 时却发现编号1的祖先在输入第73行(8303 2675)时变成了编号2675,且编号8303和2675在当时都是首次出现,也就是说8303和2675在那之前是和别的节点没有任何联系的(包括1),所以1的祖先是怎么变的?!!
#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
int n,m,p,q,f[20005],x,y,t;
int ff(int g){
if(f[g]==g)return g;
return f[g]=ff(f[g]);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n>>m>>p>>q;
for(int i=0;i<=10000+m;i++)f[i]=i;
while(p--){
int u,v;cin>>u>>v;
u+=10000,v+=10000;
if(u>v)swap(u,v);
f[ff(v)]=ff(u);
/*if(u==18303 || v==18303){
cout<<f[10001]<<endl;
system("pause");
}*/
}
while(q--){
int u,v;cin>>u>>v;
u+=10000,v+=10000;
if(u<v)swap(u,v);
f[ff(v)]=ff(u);
//if(ff(9999)!=9999)system("pause");
}
for(int i=10000-n;i<10000;i++){
//cout<<ff(i)<<' ';
if(ff(i)==9999)x++;
}
cout<<endl;
for(int i=10001;i<=10000+m;i++){
//cout<<ff(i)<<' ';
if(ff(i)==10001)y++;
}
//cout<<endl;
cout<<min(x,y);
return 0;
}