这道题是一道并查集的模板题,借此机会复习一下模板。
开一个cnt数组记录一下每个集合的祖宗节点,最后统计一下个数
原题链接
#include <bits/stdc++.h>
using namespace std;
int m,n,k,num=0;
int a,b;
const int T=1000005;
int p[T],cnt[T];
int find(int x)//寻找祖宗节点
{
if(p[x]!=x) return p[x]=find(p[x]);
return x;
}
void join(int a,int b)//集合合并
{
p[find(a)]=find(b);
}
int main()
{
memset(cnt,0,sizeof cnt);
cin>>m>>n>>k;
for(int i=1;i<=m*n;i++)
{
p[i]=i;
}
while(k--)
{
cin>>a>>b;
if(find(a)!=find(b))
{
join(a,b);
}
}
for(int i=1;i<=m*n;i++)
{
cnt[find(i)]=1;
}
for(int i=1;i<=m*n;i++)
{
if(cnt[i])
{
num++;
}
}
cout<<num<<endl;
}