并查集得到各点连通性,遍历并查集数组计数根节点。
#include<stdio.h>
#include<stdlib.h>
int getf(int *array,int num)
{
if(array[num]==num)
return num;
else
{
array[num]=getf(array,array[num]);
return array[num];
}
}
void unionf(int *array,int m,int n)
{
int i=getf(array,m);
int j=getf(array,n);
if(i!=j)
array[j]=i;
return;
}
int main(int argc,char **argv)
{
int m,n,i,j;
scanf("%d%d",&m,&n);
int *array=(int*)calloc(m*n+1,sizeof(int));
for(i=1;i<=m*n;i++)
array[i]=i;
int cnt;
scanf("%d",&cnt);
while(cnt--)
{
int sa,sb;
scanf("%d%d",&sa,&sb);
unionf(array,sa,sb);
}
int sum=0;
for(i=1;i<=m*n;i++)
if(i==array[i])
sum++;
printf("%d\n",sum);
free(array);
return EXIT_SUCCESS;
}