本题是标准的并查集板子题。具体原理附上一个博客
【算法与数据结构】—— 并查集_酱懵静的博客-CSDN博客_并查集
直接上代码了
#include<iostream>
using namespace std;
int pre[1000005],num[1000005];
int find(int x)
{
while(pre[x] != x)
x = find(pre[x]);
return x;
}
void join(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
{
if(num[fx]>num[fy])
{
pre[fy]=fx;
num[fx]+=num[fy];
}
else
{
pre[fx]=fy;
num[fy]+=num[fx];
}
}
return ;
}
int main()
{
int m,n,k,x,y;
cin>>m>>n>>k;
int z=m*n;
for(int i=1;i<=z;i++)
{
pre[i]=i;
num[i]=1;
}
for(int i=1;i<=k;i++)
{
cin>>x>>y;
join(x,y);
}
int ans=0;
for(int i=1;i<=z;i++)
if(pre[i]==i) ans++;
cout<<ans<<endl;
return 0;
}