题目链接
    image.png

    1. class Solution {
    2. // 1.我的,深度优先
    3. public int findCircleNum1(int[][] arr) {
    4. boolean[] bool = new boolean[arr.length];
    5. // 保存省份
    6. int count = 0;
    7. for(int i = 0; i < arr.length; i++) {
    8. // 查询与1相连或者间接连接的城市
    9. if(bool[i]) continue;
    10. count++;
    11. // 当前城市被使用
    12. bool[i] = true;
    13. // 将其所关联的进行标识
    14. for(int j = 0; j < arr.length; j++) {
    15. if(i != j && arr[i][j] == 1) {
    16. bool[j] = true;
    17. logo(j, bool, arr);
    18. }
    19. }
    20. }
    21. return count;
    22. }
    23. /**
    24. * 标识关联的点
    25. */
    26. public void logo(int index, boolean[] bool, int[][] arr) {
    27. for(int i = 0; i < bool.length; i++) {
    28. if(i != index) {
    29. if(!bool[i] && arr[index][i] == 1) { // 有关联
    30. bool[i] = true;
    31. // 这里也需要间接查询标识
    32. logo(i, bool, arr);
    33. }
    34. }
    35. }
    36. }
    37. // 2.老师的深度优先
    38. public int findCircleNum(int[][] arr) {
    39. int citys = arr.length;
    40. boolean[] visited = new boolean[citys];
    41. int provinces = 0; // 计数器
    42. for(int i = 0; i < citys; i++) {
    43. if(!visited[i]) { // 深度优先
    44. dfs(i, citys, visited, arr);
    45. provinces++;
    46. }
    47. }
    48. return provinces;
    49. }
    50. public void dfs(int i, int citys, boolean[] visited, int[][] arr) {
    51. for(int j = 0; j < citys; j++) {
    52. if(arr[i][j] == 1 && !visited[j]) {
    53. visited[j] = true;
    54. dfs(j, citys, visited, arr);
    55. }
    56. }
    57. }
    58. }