并查集方法
int find(int i,int*roots){
while(i!=roots[i])i=roots[i];
return i;
}
void Union(int x,int y,int *count,int *roots,int *rank){
int rootx=find(x,roots); //找到x的根节点
int rooty=find(y,roots); //找到y的根节点
if(rootx==rooty)return; //x,y 是同一个跟节点的后继,是联通的
if(rank[rootx]>rank[rooty]){ //记录树高度,进行优化
roots[rooty]=rootx;
}else if(rank[rootx]<rank[rooty]){//将x所在的连通图合并到y所在的图中。
roots[rootx]=rooty;
}else{
roots[rootx]=rooty;
rank[rooty]=rank[rooty]+1;
}
(*count)--;
}
void dfs(int **M,int i, int j,int MSize,int col);
int findCircleNum(int** M, int MSize, int* MColSize){
int col=MColSize[0];
int *roots=malloc(sizeof(int)*MSize);
int *rank=malloc(sizeof(int)*MSize);