并查集得到各点连通性,遍历并查集数组计数根节点。
#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; }