力扣 547.朋友圈
本题可以使用并查集的方法做,也可以使用邻接矩阵的深度优先搜索方法做,
本篇文章使用邻接矩阵的深度优先搜索方法
void Dfs(int startRow, int matrixNum, bool **visitFlag, int** input)
{
int i;
if (startRow == matrixNum) {
return;
}
for (i = 0; i < matrixNum; i++) {
if ((input[startRow][i] == 1) && (visitFlag[startRow][i] == false)) {
visitFlag[startRow][i] = true;
Dfs(i, matrixNum, visitFlag, input);
}
}
}
int findCircleNum(int** M, int MSize, int* MColSize)
{
int num = 0;
int i;
int j;
bool **visitFlag = (bool **)malloc(MSize * sizeof(bool *));
for (i = 0; i < MSize; i++) {
visitFlag[i] = (bool *)calloc(MSize, sizeof(bool));
}
for (i = 0; i < MSize; i++) {
for (j = 0; j < MColSize[i]; j++) {
if ((M[i][j] == 1) && (visitFlag[i][j] == false)) {
num++;
visitFlag[i][j] = true;
Dfs(i, MSize, visitFlag, M);
}
}
}
for (i = 0; i < MSize; i++) {
free(visitFlag[i]);
visitFlag[i] = NULL;
}
free(visitFlag);
visitFlag = NULL;
return num;
}
用例代码如下
#define MATRIX_ROW_NUM 200
int main()
{
freopen("test/1.in", "r", stdin);
int *M[MATRIX_ROW_NUM];
int MColSize[MATRIX_ROW_NUM];
int MSize = MATRIX_ROW_NUM;
int i;
int j;
for (i = 0; i < MATRIX_ROW_NUM; i++) {
M[i] = (int *)malloc(MATRIX_ROW_NUM * sizeof(int));
MColSize[i] = MATRIX_ROW_NUM;
for (j = 0; j < MATRIX_ROW_NUM; j++) {
scanf("%d", &M[i][j]);
}
}
printf("%d\n", findCircleNum(M, MSize, MColSize));
system("pause");
return 0;
}