解题思路:
1,按照richer数组创建邻接矩阵,不过要注意一下指向,从穷人指向富人
2,从任意一点出发dfs搜索,能遍历到的点就是比当前点富有的人,然后按照题目要求保存安静值小的人
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int dfs(int poorId, int *ret, int *quiet, int **matrix, int quietSize)
{
if(ret[poorId] != -1)
return ret[poorId];
int cur_poorId = poorId;
for(int i=0; i<quietSize; i++)
{
if(matrix[poorId][i] == 1)
{
int temp = dfs(i,ret,quiet,matrix,quietSize);
if(quiet[temp] < quiet[cur_poorId])
cur_poorId = temp;
}
}
ret[poorId] = cur_poorId;
return cur_poorId;
}
int* loudAndRich(int** richer, int richerSize, int* richerColSize, int* quiet, int quietSize, int* returnSize)
{
int i;
//创建邻接矩阵,穷人指向富人
int **matrix = (int**)malloc(quietSize*sizeof(int*));
for(i=0; i<quietSize; i++)
{
matrix[i] = (int*)malloc(quietSize*sizeof(int));
memset(matrix[i],0,quietSize*sizeof(int));
}
for(i=0; i<richerSize; i++)
{
matrix[richer[i][1]][richer[i][0]] = 1;
}
//对邻接矩阵进行dfs遍历,从任何一点能遍历到的点都是比当前点富的人
int *ret = (int*)malloc(quietSize*sizeof(int));
memset(ret,-1,quietSize*sizeof(int));
for(i=0; i<quietSize; i++)
{
ret[i] = dfs(i,ret,quiet,matrix,quietSize);
}
for(i=0; i<quietSize; i++)
free(matrix[i]);
free(matrix);
*returnSize = quietSize;
return ret;
}
运行结果: